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?