我有一个基于Winsock的服务器应用程序,它使用Windows Winsock I/O完成端口。因此,接受的每个连接都与侦听套接字相关联,以开始接收通知(读取,写入,关闭等)。
监听套接字有100个未决连接积压。
一切都很好。Winsock - 停止接受新的连接,但保持与现有连接的通信
在某些时候,我想停止接受新的连接,但保持与已连接的现有连接套接字的通信。
我想我可以做的一个:
- 停止调用WSAAccept()。
- 将积压设置为零,有效地禁止任何到挂起的连接。
- 在监听套接字上调用shutdown()& closesocket()。
现在,选项#1给出了预期的结果;我的应用程序不处理新的连接,但它确实接受积压量(100)。连接实际上被做 - 我不要它!
选项#2;我可以这样做吗?怎么样?无法在MSDN或谷歌上找到。 MSDN网站listen()的文档说:
如果听功能称为 已经监听套接字,它将 回报的成功不改变 值积压参数。 在 中将backlog参数设置为0后续呼叫在 侦听套接字上侦听时不被视为 正确的重置,尤其是在套接字上有 连接的情况下。
不适合我。
如果我能以安全的方式这样做,我会将它与选项#1结合起来,有效地真正停止在机器上建立任何新的连接(通过侦听端口!)。
选项#3实际工作;关闭监听套接字后,我仍然可以与现有连接进行通信,并且积压已经消失(好了,关闭了监听套接字!)。
我担心的是这种方法可能会有一些副作用。有人可以确认吗?
是的,#3是正确的答案。 – 2010-08-09 21:57:47
优秀的答案!“证明”正是我需要安心的!看,我担心新接受的conn与IOCP监听套接字的关联会产生一些依赖关系。再次感谢你! – Poni 2010-08-09 22:01:08