tcp socket에서 큰 데이타 한번에 받으려면 어떻게 합니까?

cnyld의 이미지

양쪽에서 tcp socket을 열었습니다.
40000 byte의 데이터를 주고 받을려고 하는데,
send에서는 한번의 call로 다 보내는데,
flagment되어서
recv에서는 첫 packet맏고 return 되어 옵니다.
버퍼는 충분히 크게 줬는데...

먼.. 옵션을 줘야 되는 건가요?
아니면 recv를 여러번 해야 하나요?
알려 주시면 대단히 감사하겠습니다.

-------- recv 부분 ---------------------------

main()
{

int ret, ssd;
struct sockaddr_in cli_addr, serv_addr;
int nsd, clilen, n, t;
char rpkt[40000];

ssd = socket( AF_INET, SOCK_STREAM, 0 );
if( ssd < 0 )
{
printf("socket error\n");
return -1;
}

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = /*htonl*/( INADDR_ANY );
serv_addr.sin_port = htons( 5105 );

if( bind( ssd, (struct sockaddr *) &serv_addr, sizeof( serv_addr ) ) < 0 )
{
return -1;
}

if( listen( ssd, 20 ) )
{
perror("listen error");
return -1;
}

printf("waiting for connection...\n");
nsd = accept( ssd, (struct sockaddr *)&cli_addr, &clilen );
if( nsd < 0 )
{
perror( "accept error" );
}
printf("connected\n");
n = recv( nsd, &rpkt, 40000, 0 );
printf( "read %d bytes\n", n );

close( nsd );
close( ssd );
}

vness의 이미지

recv를 여러번 하시거나..

recv의 MSG_WAITALL flag를 사용하시면 1번의 호출로 해결됩니다.

단 MSG_WAITALL flag를 사용하셔도 signal에 의해서 interrupt되거나

에러가 발생하면 recv가 리턴됩니다.

pynoos의 이미지

MSG_WAITALL도 좋은데 공부하신다면,
처음 보낼때 길이를 보내시고..
길이가 다 받기전까지 recv를 계속하세요.

한 두줄 가지고 안됩니다.