TCP是流式的,对端发送来的数据可能需要调用多次recv才能接收完,因此需要自己定义格式,一般是一个结构,比如前n个字节定义长度,用某个特殊字节表示结束等方法来辨别数据是否发送完毕。

解决方案 »

  1.   

    有个办法你可以试一下,首先我们提出一个假设,假设我们的缓冲区大小1024字节,如果一次接收完成,那么接收到的字节数,也就是recv的返回值肯定小于等于1024,但是如果一次没有接收完,那么接收到的字节数肯定等于1024。
    如果这个假设成立了,那么就好办了。
    1、接收,recv返回值为num
    2、if (num==SOCKET_ERROR)  表示没有接收的了,或者上次都接收完了
       else
            if (num==1024) 转1      表示刚好接收完,或者没有接收完
            else                    不用说了,肯定接收完了
      

  2.   

    1、if (num==SOCKET_ERROR)  表示没有接收的了,或者上次都接收完了
    这条好象有点问题,我试了试,接受完了,num也不会等于SOCKET_ERROR,具体的代码如下:nRet = send(Socket, szBuffer, strlen(szBuffer), 0);

    if (nRet == SOCKET_ERROR)
    {
    PRINTERROR("send()");
    closesocket(Socket);
    return;
    }
      

    while(1) {
    nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
    if (nRet == SOCKET_ERROR)
    {
    cout <<'nRet==SOCKET_ERRO';
    break;
    }         cout <<szBuffer;

    }
    closesocket(Socket); WSACleanup();
    }
      

  3.   

    只有SERVER端断开连接,client端才会num==SOCKET_ERROR