2010-08-09 59 views
6

我有一个基于Winsock的服务器应用程序,它使用Windows Winsock I/O完成端口。因此,接受的每个连接都与侦听套接字相关联,以开始接收通知(读取,写入,关闭等)。
监听套接字有100个未决连接积压。
一切都很好。Winsock - 停止接受新的连接,但保持与现有连接的通信

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

我想我可以做的一个:

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

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

选项#2;我可以这样做吗?怎么样?无法在MSDN或谷歌上找到。 MSDN网站listen()的文档说:

如果听功能称为 已经监听套接字,它将 回报的成功不改变 值积压参数。 在 中将backlog参数设置为0后续呼叫在 侦听套接字上侦听时不被视为 正确的重置,尤其是在套接字上有 连接的情况下。

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

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

我担心的是这种方法可能会有一些副作用。有人可以确认吗?

回答

8

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

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

+0

是的,#3是正确的答案。 – 2010-08-09 21:57:47

+0

优秀的答案!“证明”正是我需要安心的!看,我担心新接受的conn与IOCP监听套接字的关联会产生一些依赖关系。再次感谢你! – Poni 2010-08-09 22:01:08