从winapi socket正确接收

时间:2013-09-17 13:12:29

标签: c++ sockets winapi recv

MSDN提供以下代码:

    int iResult;
    // Receive until the peer closes the connection 
    do { 

        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
        if ( iResult > 0 ) 
            printf("Bytes received: %d\n", iResult); 
        else if ( iResult == 0 ) 
            printf("Connection closed\n"); 
        else 
            printf("recv failed: %d\n", WSAGetLastError()); 

    } while( iResult > 0 ); 

iResult存储收到的字节数!在我的情况下,我不能这样做,因为如果没有收到任何东西(或达到结束),接收会挂起 - >所以退出条件永远不会匹配!

有什么问题和/或为什么recv会在这里挂起?

迎接

3 个答案:

答案 0 :(得分:3)

这是因为默认情况下套接字是阻塞的。这意味着呼叫例如recv将阻止直到收到某些内容。您可以使用ioctlsocket函数使套接字无阻塞。

如果没有可用的内容,您必须准备recv可以返回WSAEWOULDBLOCK错误。或者使用select等轮询功能来了解何时可以接收数据。如果您不想轮询,请在MSDN上搜索“异步套接字”以查找服务器和客户端示例。

答案 1 :(得分:0)

实际上,如果套接字上没有可用的传入数据,则recv将阻塞直到数据到达。您可以使用select()确定何时有更多数据到达,然后使用recv()来读取它。

答案 2 :(得分:0)

  

如果没有收到任何内容,收据会挂起

正确。

  

(或已达到结束)

不正确的。在这种情况下它返回零。但是,“到达终点”意味着对等方已关闭连接。可能你还有其他的定义吗?

我怀疑你的问题是对等方没有关闭连接,你仍然期待零。它没有那种方式。