为啥我的 Winsock 应用程序有时在 listen() 处等待,有时在 accept() 处等待?

Posted

技术标签:

【中文标题】为啥我的 Winsock 应用程序有时在 listen() 处等待,有时在 accept() 处等待?【英文标题】:Why does my Winsock app sometimes wait at listen() and sometimes at accept()?为什么我的 Winsock 应用程序有时在 listen() 处等待,有时在 accept() 处等待? 【发布时间】:2015-09-27 21:42:06 【问题描述】:

大家好,我正在使用 Visual C++ 2010,正在尝试使用 Winsock 编写服务器/客户端应用程序...我不知道为什么,但有时服务器在 listen() 函数处等待,有时在接受处等待()。只是想知道,这两个函数的机制是什么?难道不应该在listen()处等待,直到它听到传入的连接,然后继续accept()?

【问题讨论】:

【参考方案1】:

listen 函数将套接字置于侦听模式。您只需调用此函数一次。通常,此函数会立即返回。

通过调用accept 函数接受传入的连接。在阻塞模式下(默认),它仅在接受新连接或发生错误时返回。

【讨论】:

【参考方案2】:

它没有。你的观察是错误的。 listen() 不是阻塞调用。它所做的只是将端口置于 LISTENING 状态,要么成功要么失败。没有什么可以阻止的。

accept() 阻塞,等待入站连接。

【讨论】:

不,listen() 是 blocking call。但在大多数情况下,它会立即返回。 @AndreyNasonov 好的,它在文档中。你知道在什么情况下会发生这种情况吗?除非您做一些非常深奥的事情,否则这可能是不可能的。 @AndreyNasonov 我坚信文档不正确。 listen() 不需要等待任何网络事件。 @EJA 是的,我认为那是废话。 @EJP 另一方面,ReactOS 源代码似乎正在做一些可能需要阻塞的事情。我不太了解它,但在完成之前听向其他东西发出 IRP。也许 Windows 网络堆栈在这里具有可扩展性。

以上是关于为啥我的 Winsock 应用程序有时在 listen() 处等待,有时在 accept() 处等待?的主要内容,如果未能解决你的问题,请参考以下文章

netsh winsock reset - 它有啥作用,为啥我的无线网卡没有建立良好的连接,直到我使用该命令?

我在 vb6(winsock) 中创建的客户端/服务器程序不能在 WAN 上运行,但可以在 LAN 上完美运行 为啥?

为啥winsock 不在这里提供WSAESHUTDOWN?

winsock SPLIT 数组

vb以二进制打开excel后用winsock发送,结果接收后打开的是乱码,发送别的文件没问题,为啥?

为啥有时小吃店会失败