시소당
C건 Java이건 Socket을 이용해서 read 하는 경우에는 원하는 사이즈만큼 못 읽는 경우가 종종 있습니다. 대략 tcp/ip의 커널 파라미터의 영향인데요...
이 경우는 읽는 방식을 고치면 다 읽을수가 있습니다.
*JAVA
// 이렇게 읽는 경우는 50000을 다 못 읽어오는 경우가 발생을 합니다..
byte xmlBytes[] = new byte[50000];
real_read = _input.read(xmlBytes, 0, xmlBytes.length);
// 원하는 바이트가 읽을때까지 처리하는 로직/
byte xmlBytes[] = new byte[50000];
int real_read = 1;
int read_offset = 0;
while(real_read>0) {
real_read = _input.read(xmlBytes, read_offset, xmlBytes.length-read_offset);
read_offset+= real_read;
}
* C
char rcv_msg[MAX_MSG];
int rcv_size = 1;
while (rcv_size > 0) {
if ((rcv_size=recv(newSd, rcv_msg, MAX_MSG, 0)) < 0) {
perror("[TCP ERROR] cannot receive data ");
return ERROR;
}
total_read+=rcv_size;
}
방식은 거의 동일하죠...
java, C의 read/recv 함수의 리턴값은 실제 읽은 사이즈를 리턴합니다.
이를 실제 읽고자 하는 전체 사이즈에서 빼주고, 다시 읽는 것입니다.
[출처] socket에서 데이터가 덜 읽히는 문제 해결법.|작성자 하자두
http://blog.naver.com/hazard11?Redirect=Log&logNo=80023556714