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

Pon*_*oni 7 c++ sockets winsock

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

因此,接受的每个连接与监听套接字相关联以开始接收通知(读取,写入,关闭等).
侦听套接字有100个待处理连接的积压.
一切都很好.

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

我想我可以做一个:

  1. 停止调用WSAAccept().
  2. 将积压设置为零,有效地禁止任何连接到挂起.
  3. 在侦听套接字上调用shutdown()和closesocket().

现在,选项#1给出了预期的结果; 我的应用程序不处理新连接,但它确实接受积压的数量(100).实际上是连接 - 我不想要它!

选项#2 ; 我能这样做吗?怎么样?在MSDN上也找不到谷歌.MSDN上的listen()文档说;

如果在已经侦听的套接字上调用listen函数,它将返回成功而不更改backlog参数的值.在后续调用侦听侦听套接字时将backlog参数设置为0不被视为正确重置,尤其是在套接字上存在连接时.

对我不好.
如果我能以安全的方式这样做,我会将它与选项#1结合起来,有效地停止在机器上建立任何新的连接(通过监听端口!).

选项#3实际上有效; 关闭侦听套接字后,我仍然可以与现有连接通信,并且积压已经消失(好吧,关闭监听套接字!).

我担心这种方法可能会产生一些副作用.谁能确认一下?

sth*_*sth 9

您只需关闭侦听套接字即可.接受的连接有自己的套接字,关闭监听套接字不会影响它们.

例如,在Microsoft文档中有一个示例服务器应用程序,其中演示了基本的套接字使用情况.在通过接受的套接字进行通信之前(在执行循环之前),监听套接字被关闭.