我有一個基於Winsock的服務器應用程序,它使用Windows Winsock I/O完成端口。因此,接受的每個連接都與偵聽套接字相關聯,以開始接收通知(讀取,寫入,關閉等)。
監聽套接字有100個未決連接積壓。
一切都很好。Winsock - 停止接受新的連接,但保持與現有連接的通信
在某些時候,我想停止接受新的連接,但保持與已連接的現有連接套接字的通信。
我想我可以做的一個:
- 停止調用WSAAccept()。
- 將積壓設置爲零,有效地禁止任何到掛起的連接。
- 在監聽套接字上調用shutdown()& closesocket()。
現在,選項#1給出了預期的結果;我的應用程序不處理新的連接,但它確實接受積壓量(100)。連接實際上被做 - 我不要它!
選項#2;我可以這樣做嗎?怎麼樣?無法在MSDN或谷歌上找到。 MSDN網站listen()的文檔說:
如果聽功能稱爲 已經監聽套接字,它將 回報的成功不改變 值積壓參數。 在 中將backlog參數設置爲0後續呼叫在 偵聽套接字上偵聽時不被視爲 正確的重置,尤其是在套接字上有 連接的情況下。
不適合我。
如果我能以安全的方式這樣做,我會將它與選項#1結合起來,有效地真正停止在機器上建立任何新的連接(通過偵聽端口!)。
選項#3實際工作;關閉監聽套接字後,我仍然可以與現有連接進行通信,並且積壓已經消失(好了,關閉了監聽套接字!)。
我擔心的是這種方法可能會有一些副作用。有人可以確認嗎?
是的,#3是正確的答案。 – 2010-08-09 21:57:47
優秀的答案!「證明」正是我需要安心的!看,我擔心新接受的conn與IOCP監聽套接字的關聯會產生一些依賴關係。再次感謝你! – Poni 2010-08-09 22:01:08