0

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 挂在这里?

问候

4

3 回答 3

3

这是因为默认情况下,套接字是阻塞的。这意味着对 eg 的调用recv将阻塞,直到收到某些内容。您可以使用该ioctlsocket功能使套接字非阻塞。

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

于 2013-09-17T13:17:38.937 回答
0

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

于 2013-09-17T13:21:55.080 回答
0

如果未收到任何内容,则接收挂起

正确的。

(或到达终点)

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

我怀疑您的问题是对等方没有关闭连接,而您仍然期望为零。它不是那样工作的。

于 2013-09-17T22:06:56.357 回答