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

时间:2010-08-09 21:36:25

标签: c++ sockets winsock

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

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

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

我想我可以做其中一个:

  1. 停止调用WSAAccept()。
  2. 将积压设置为零,有效地禁止与挂起的任何连接。
  3. 致电shutdown()& listen socket上的closesocket()。
  4. 现在,选项#1 会给出预期的结果;我的应用程序不处理新连接,但它确实接受积压的数量(100)。实际上是连接 - 我不想要它!

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

      

    如果调用listen函数   已经在监听套接字,它会   返回成功而不改变   backlog参数的值。   将backlog参数设置为0 in   随后打电话来听一听   监听套接字不被认为是   适当的重置,特别是如果有的话   插座上的连接。

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

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

    我担心这种方法可能会产生一些副作用。任何人都可以确认吗?

1 个答案:

答案 0 :(得分:9)

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

例如,在Microsoft文档中有a sample server application,其中演示了基本的套接字使用情况。在通过接受的套接字进行通信之前(在do-while-loop之前),监听套接字被关闭。