【问题标题】:Winsock - stop accepting new connections yet keep comm with existing connectionsWinsock - 停止接受新连接但与现有连接保持通信
【发布时间】:2011-03-27 13:01:03
【问题描述】:

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

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

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

我想我可以做以下之一:

  1. 停止调用 WSAAccept()。
  2. 将积压设置为零,实际上禁止任何连接挂起。
  3. 在监听套接字上调用 shutdown() 和 closesocket()。

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

选项#2;我可以这样做吗?如何?在 MSDN 和 google 上都找不到。 MSDN 上listen() 的文档说;

如果监听函数被调用 已经在监听套接字,它会 返回成功而不更改 backlog 参数的值。 将 backlog 参数设置为 0 随后的通话以收听 监听套接字不被视为 适当的重置,特别是如果有 套接字上的连接。

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

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

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

【问题讨论】:

    标签: c++ sockets winsock


    【解决方案1】:

    您可以简单地关闭监听套接字。接受的连接有自己的套接字,它们不会受到关闭监听套接字的影响。

    例如,在 Microsoft 文档中,a sample server application 演示了基本的套接字用法。在通过接受的套接字进行通信之前(在 do-while 循环之前),侦听套接字已关闭。

    【讨论】:

    • 优秀的答案! “证明”正是我安心所需要的!!看,我担心新接受的 conn 与 IOCP 侦听套接字的关联会产生一些依赖性。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多