我有一个基于Winsock的服务器应用程序,它使用Windows Winsock I/O完成端口。
因此,每个接受的连接都与侦听套接字相关联,以开始接收通知(读取、写入、关闭等)。
侦听套接字具有100个挂起连接的后备。
一切正常。
在某些时候,我想停止接受新连接,但保持与已连接的现有套接字的通信。
我想可以采取以下方法之一:
- 停止调用WSAAccept()。
- 将后备设置为零,从而禁止任何连接挂起。
- 对侦听套接字调用shutdown()和closesocket()。
现在,选项#1产生了预期的结果;我的应用程序不处理新连接,但它最多接受后备数量(100)的连接。实际上已经建立连接 - 我不想要这个!
选项#2;我可以这样做吗?如何操作?无法在MSDN或Google上找到。MSDN上listen()的文档说;
如果在已经监听的套接字上调用listen函数,它将返回成功,但不会更改backlog参数的值。在后续对监听套接字调用listen时将backlog参数设置为0被认为不是适当的复位操作,特别是如果套接字上存在连接。对我来说不好。
如果我能以一种安全的方式这样做,我将与选项#1结合使用,有效地停止在计算机上建立任何新连接(通过监听端口!)。
选项#3实际上可以工作;关闭监听套接字后,我仍然可以与现有连接通信,并且backlog已消失(好吧,关闭了监听套接字!)。
我的担忧是这种方法可能会产生一些副作用。有人能确认吗?