Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从winapi套接字正确接收_C++_Sockets_Winapi_Recv - Fatal编程技术网

C++ 从winapi套接字正确接收

C++ 从winapi套接字正确接收,c++,sockets,winapi,recv,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);

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为什么挂在这里


问候

这是因为默认情况下,套接字是阻塞的。这意味着对例如recv的调用将被阻止,直到接收到某些内容。您可以使用该函数使套接字不阻塞


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

这是因为默认情况下,套接字是阻塞的。这意味着对例如recv的调用将被阻止,直到接收到某些内容。您可以使用该函数使套接字不阻塞


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

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

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

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

(或到达终点)

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

我怀疑您的问题是对等方没有关闭连接,而您仍然期望零。这样不行

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

(或到达终点)

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


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

您还可以使用
setsockopt()
为阻塞操作指定超时,而不使套接字本身成为非阻塞。您还可以使用
setsockopt()
为阻塞操作指定超时,而不使套接字本身成为非阻塞。