在send()调用之后,Windows上的非阻塞套接字不会返回

时间:2009-11-15 20:57:34

标签: c++ c networking network-programming sockets

我希望有人可以解释一种情况 - 任何情况 - 在使用send()之后,非阻塞的Windows套接字不会立即返回。在其他平台上,我的代码按预期工作,因此它似乎是特定于Windows的问题。

我可以告诉它不返回的方式非常简单:我{(1}}紧接send()函数之前和之后的消息,并且在运行时,控制台仅显示第一条消息。我似乎无法在一个简化的例子中重现它,所以我为缺乏代码道歉。如有必要,我会尝试提供更多细节。

编辑:

创建套接字并将其设置为非阻塞的特定代码如下。我假设非阻塞套接字确实没有办法以这种方式运行,并且其他东西导致它在显示第二条消息之前停止。无论如何,谢谢你的帮助......我会尽力去做到底,但是现在我很神秘。

cout

3 个答案:

答案 0 :(得分:1)

如果你的“cout”消息显示不包含std :: endl,那么在你没有注意到的情况下,呼叫可能不会阻塞!

答案 1 :(得分:1)

发送将阻止填充已连接套接字上的ip堆栈缓冲区。如果你有一个连接的套接字,并且你开始更快地向它投掷数据,那么ip stack就可以通过附带的ack nak paddywack将它滚出电线,然后发送将阻止。

我还没有看到正确设置非阻塞发送会阻止。他们会因为阻塞而出错。所以我会看看你如何设置非阻塞io。您确定在结果套接字上设置非阻塞而不是基本套接字...即从accept返回的套接字。

答案 2 :(得分:1)

如果这是实际代码,则您尚未初始化 ul 。做:

unsigned long ul = 1;
ioctlsocket(new_sock, FIONBIO, &ul);