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会在这里挂起?
迎接
答案 0 :(得分:3)
这是因为默认情况下套接字是阻塞的。这意味着呼叫例如recv
将阻止直到收到某些内容。您可以使用ioctlsocket
函数使套接字无阻塞。
如果没有可用的内容,您必须准备recv
可以返回WSAEWOULDBLOCK
错误。或者使用select
等轮询功能来了解何时可以接收数据。如果您不想轮询,请在MSDN上搜索“异步套接字”以查找服务器和客户端示例。
答案 1 :(得分:0)
实际上,如果套接字上没有可用的传入数据,则recv将阻塞直到数据到达。您可以使用select()确定何时有更多数据到达,然后使用recv()来读取它。
答案 2 :(得分:0)
如果没有收到任何内容,收据会挂起
正确。
(或已达到结束)
不正确的。在这种情况下它返回零。但是,“到达终点”意味着对等方已关闭连接。可能你还有其他的定义吗?
我怀疑你的问题是对等方没有关闭连接,你仍然期待零。它没有那种方式。