【发布时间】: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 确实有效;关闭监听套接字后,我仍然可以与现有连接进行通信,并且积压已经消失(好吧,关闭监听套接字!)。
我担心这种方法可能会产生一些副作用。谁能确认一下?
【问题讨论】: