2010-08-09 64 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