도와주세요!!
글 수 15,339
2012.08.01 11:08:17 (*.33.98.200)
17718
안녕하세요 TCP/IP를 이용하여 통신을 하고 있는데요.
Client -> Server로 1K + 24byte의 Size의 Data송신하면 정상적으로 동작을 합니다.
그렇지만
Client -> Server로 32K + 24byte의 Size의 Data송신하면 4K정도는 들어오는데 나머지 Data들이 들어오지를 않습니다.
read(), write()를 이용하여 송수신을 하고 있는데요.
client에서 write()에서 32K +24byte의 Data를 송신하는것은 확인을 했는데.
server에서 read()를 할때 Data가 전부 들어오지가 않는 군요.
read()의 return값을 보니 32K+24byte가 되어야 할것 같은데요. 이게 4K정도 밖에 되질 않습니다.
recv(), send()의 flag를 0으로 설정하고 해보니 현상은 비슷하구요.ㅡㅡ;
32K 나 64K Data를 송수신 할수 있는 방법이 없는 건가요.?
server Code.......
printf("Bind ..."); if(-1 == bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr))) { printf(" Bind Fail...!\n"); return 1; } printf("OK!\n"); printf("listen..."); if(listen(sockfd, 5) == -1) { printf(" Fail...!\n"); return 1; } printf("OK!\n"); printf("Accept..."); cli_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_addr_size); if(cli_sockfd == -1) { printf(" Fail...!\n"); return 1; } printf("OK!\n"); buf_size = sizeof(ret_buf); rn = sizeof(int); //if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buf_size, (socklen_t)rn) == -1) { // printf("Set Socket Option Fail....\n"); //} if(getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buf_size, (socklen_t*)&rn) == -1) { printf("Get Socket Option Fail...\n"); } printf("Socket Buffer size [%d]\n", buf_size); while(1) { printf("Recevied Data Wait..."); ret = read(cli_sockfd, (void*)ret_buf, sizeof(ret_buf)); if(ret < 0) { printf("Recevied Fail !\n"); } else { printf("Recevied Completei[%d]!\n", ret); data_size = *(int*)(&ret_buf[4]); //stx + + next Data Area tx_pac_size = data_size + sizeof(tx_data_t) + 16; //+ 4; rx_pac_size = data_size + sizeof(rx_data_t) + 16; //+ 4; raw_data = malloc(tx_pac_size); ret_data = malloc(rx_pac_size); memcpy(raw_data, ret_buf, tx_pac_size); if((raw_data->stx == fstx) && (*(int*)(&raw_data->data[raw_data->datalen + 12]) == fetx)) { ret_data->stx = fstx; memcpy(ret_data->ret_data, raw_data->data, raw_data->datalen); printf("Send Data Wait..."); ret = write(cli_sockfd, (void*)ret_data, rx_pac_size); if(ret < 0) { printf("Send Fail !\n"); break; } else { printf("Send Complete !\n"); } } } }
소스 코드를 보니 수신 데이터에서 전체 데이터 길이를 받아 처리하시네요.
data_size = *(int*)(&ret_buf[4]); //stx + + next Data Area
그렇다면 32k+24byte를 한 번에 받아서 처리하시는 것으로 생각됩니다.
그럼에도 while()문을 사용하셨구요.
우선 ret = read(cli_sockfd, (void*)ret_buf, sizeof(ret_buf)); 에서
ret_buf 크기만큼 읽어 들이셨습니다.
ret_buf 크기가 한 번에 읽어 들일 수 있을 정도로 충분히 큰 버퍼인가요?
최소 32k+24 byte 크기여야 합니다.
만일 버퍼 크기가 4k라면 당연히 read() 함수의 리턴값은 4k이겠죠.
그러나 이렇게 큰 데이터는 한 번에 읽어서 처리하기 보다는
while()문을 사용하신 것처럼 1k나 2k씩 나누어 읽어서 처리하는 방법을
권합니다. 최소 버퍼 크기가 32k+24 byte는 커도 많이 큽니다.
그만큼 프로그램 리소스를 많이 차지하게 되지요.