2011-03-27 56 views
0

我有一個小型的便攜式工具,連接到大約150個位於不同位置的服務器,以便從它們快速檢查狀態。將所有服務器的狀態相對快速地返回給用戶很重要,以便使用非阻塞連接並行連接到服務器,並使用select()來確定每個套接字何時準備就緒。 select()的使用相當簡單,現在該工具已經失敗成熟,並且在Linux上運行良好。它在Windows XP上運行,但與絕大多數服務器的連接沒有完成。該工具交錯調用連接以避免創建看起來像SYN氾濫的內容。它連接到一臺約100毫秒的服務器。我也有一個檢查,以確保FD_SETSIZE不被違反。我從其他人那裏得到的軼事證據表明,在後來的Windows版本上,這種行爲更好,但無法驗證。在windows XP上使用select()在許多非阻塞連接TCP套接字上錯過連接

我已經使用WinDump驗證syn包是否正在發送,並且我可以看到ack包返回,但select()一直返回零,並且代碼根本無法連接到大多數服務器存在,我可以在Linux上使用相同的代碼進行連接。

有沒有人看到或解決了許多非阻塞連接的任何類似問題,並在Windows XP上選擇?

+0

我從來沒有做過這樣的事情,但是你可以將工作分成多個流程嗎? – 2011-03-27 22:44:15

+0

如果沒有看到您的選擇處理,很難給出答案。但是你應該檢查一下,你是否獲得了每個選擇回報的所有接受的連接。您可能需要檢查多次FD_IS_SET。 – harper 2011-03-28 04:46:19

回答

0

經過一天左右的挖掘,我似乎找到了答案。在Windows XP SP2中,系統範圍內有10個併發連接套接字的限制。如果存在10個或更多半打開的連接,則會記錄一個系統事件,指出已達到限制,並且新的連接套接口將被無聲地扼殺。系統事件號碼是4226.

我已經通過爲Windows XP添加版本檢查並在這些系統上限制爲少於10個連接來修復了我的代碼。到目前爲止,我還沒有其他版本受到影響的報道。