tcp socket에서 큰 데이타 한번에 받으려면 어떻게 합니까?
양쪽에서 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 );
}
recv를 여러번 하시거나..recv의 MSG_WAITALL fl
recv를 여러번 하시거나..
recv의 MSG_WAITALL flag를 사용하시면 1번의 호출로 해결됩니다.
단 MSG_WAITALL flag를 사용하셔도 signal에 의해서 interrupt되거나
에러가 발생하면 recv가 리턴됩니다.
MSG_WAITALL도 좋은데 공부하신다면,처음 보낼때 길이를 보내시
MSG_WAITALL도 좋은데 공부하신다면,
처음 보낼때 길이를 보내시고..
길이가 다 받기전까지 recv를 계속하세요.
한 두줄 가지고 안됩니다.
---
http://coolengineer.com
댓글 달기