Winsock - 停止接受新连接但与现有连接保持通信

Posted

技术标签:

【中文标题】Winsock - 停止接受新连接但与现有连接保持通信【英文标题】:Winsock - stop accepting new connections yet keep comm with existing connections 【发布时间】:2011-03-27 13:01:03 【问题描述】:

我有一个基于 Winsock 的服务器应用程序,它使用 Windows Winsock I/O 完成端口。

因此,每个接受的连接都与侦听套接字相关联,以开始接收通知(读取、写入、关闭等)。 侦听套接字有 100 个待处理连接的积压。 一切都很好。

在某些时候,我想停止接受新连接,但仍与已连接的现有连接套接字保持通信。

我想我可以做以下之一:

    停止调用 WSAAccept()。 将积压设置为零,实际上禁止任何连接挂起。 在监听套接字上调用 shutdown() 和 closesocket()。

现在,选项 #1 给出了预期的结果;我的应用程序不处理新连接,但它确实接受了积压的数量(100)。实际上已经建立了联系 - 我不想要它!

选项#2;我可以这样做吗?如何?在 MSDN 和 google 上都找不到。 MSDN 上listen() 的文档说;

如果监听函数被调用 已经在监听套接字,它会 返回成功而不更改 backlog 参数的值。 将 backlog 参数设置为 0 随后的通话以收听 监听套接字不被视为 适当的重置,特别是如果有 套接字上的连接。

对我不好。 如果我能以一种安全的方式这样做,我会将它与选项 #1 结合起来,有效地停止在机器上建立任何新连接(通过监听端口!)。

选项 #3 确实有效;关闭监听套接字后,我仍然可以与现有连接进行通信,并且积压已经消失(好吧,关闭监听套接字!)。

我担心这种方法可能会产生一些副作用。谁能确认一下?

【问题讨论】:

【参考方案1】:

您可以简单地关闭监听套接字。接受的连接有自己的套接字,它们不会受到关闭监听套接字的影响。

例如,在 Microsoft 文档中,a sample server application 演示了基本的套接字用法。在通过接受的套接字进行通信之前(在 do-while 循环之前),侦听套接字已关闭。

【讨论】:

优秀的答案! “证明”正是我安心所需要的!!看,我担心新接受的 conn 与 IOCP 侦听套接字的关联会产生一些依赖性。再次感谢您!

以上是关于Winsock - 停止接受新连接但与现有连接保持通信的主要内容,如果未能解决你的问题,请参考以下文章

C++ Winsock API如何在接受连接之前获取连接客户端IP?

VB如何使用Winsock进行1对多通信

为啥与空列表连接时返回列表但与新列表连接时不返回?

如何中止winsock阻塞调用?

在 MFC 中使用异步过程调用中断接受 winsock 调用

VB6 Winsock 多个 TCP 连接 > DoEvents 问题