C++ 从winapi套接字正确接收
MSDN提供以下代码: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);
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()
为阻塞操作指定超时,而不使套接字本身成为非阻塞。