为啥我的 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 上完美运行 为啥?