WSAAsyncSelect中,怎么样保证接收数据完整?
代码是这样:case FD_READ:
char szText[102400] = { 0 };
memset(szText,0,102400);
::recv(s, szText, 10240, 0);
我发的包有10000字左右,
但只能收到部分,我怎么做才能保证完整性呢

解决方案 »

  1.   

    看一下recv返回的值,判断一下原因。
      

  2.   

    recv之后,如果数据没有收全,还会触发FS_READ事件,继续接受就可以了。
      

  3.   

    recv的返回值就是接收到的实际字节
      

  4.   

    是TCP通讯吗?貌似系统发送缓冲区和接受缓冲区默认没有10000字节那么大阿(我机器默认4096),所以你的发送应该会被系统分两次发出去吧,虽然你只调用一次send。
    那么接受自然一次就搞不定了,反复接受几次,如果是TCP的肯定能收齐。经验如此,如有不对,欢迎指正!
      

  5.   

    recv的返回值就是接收到的实际字节?
    详见MSDN
    If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
      

  6.   

    数据包最好有定义好的格式。比如长度+内容, 这样可能很好的应付TCP的粘包。
      

  7.   

    int left = 0; 
    int rec = 0;
    int total = 10240;
    while(total!= 0)
    {
       rec = recv(s,szText+left,total,0 );
       left += rec;
       total -=rec;
       
    }