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

7

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

因此,每个接受的连接都与侦听套接字相关联,以开始接收通知(读取、写入、关闭等)。
侦听套接字具有100个挂起连接的后备。
一切正常。

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

我想可以采取以下方法之一:

  1. 停止调用WSAAccept()。
  2. 将后备设置为零,从而禁止任何连接挂起。
  3. 对侦听套接字调用shutdown()和closesocket()。

现在,选项#1产生了预期的结果;我的应用程序不处理新连接,但它最多接受后备数量(100)的连接。实际上已经建立连接 - 我不想要这个!

选项#2;我可以这样做吗?如何操作?无法在MSDN或Google上找到。MSDN上listen()的文档说;

如果在已经监听的套接字上调用listen函数,它将返回成功,但不会更改backlog参数的值。在后续对监听套接字调用listen时将backlog参数设置为0被认为不是适当的复位操作,特别是如果套接字上存在连接。
对我来说不好。
如果我能以一种安全的方式这样做,我将与选项#1结合使用,有效地停止在计算机上建立任何新连接(通过监听端口!)。
选项#3实际上可以工作;关闭监听套接字后,我仍然可以与现有连接通信,并且backlog已消失(好吧,关闭了监听套接字!)。
我的担忧是这种方法可能会产生一些副作用。有人能确认吗?
1个回答

9
您可以简单地关闭监听套接字。已接受的连接有自己的套接字,关闭监听套接字不会影响它们。
例如,在 Microsoft 文档中有一个演示基本套接字使用的示例服务器应用程序。在那里,在完成已接受套接字上的通信之前(在 do-while 循环之前),关闭了监听套接字。

非常好的回答!“证明”正是我需要的心安理得的东西!你看,我担心新接受的 conn 与 IOCP 监听套接字之间会产生某种依赖关系。再次感谢你! - Poni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接