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
댓글 달기