我有一個小型的便攜式工具,連接到大約150個位於不同位置的服務器,以便從它們快速檢查狀態。將所有服務器的狀態相對快速地返回給用戶很重要,以便使用非阻塞連接並行連接到服務器,並使用select()來確定每個套接字何時準備就緒。 select()的使用相當簡單,現在該工具已經失敗成熟,並且在Linux上運行良好。它在Windows XP上運行,但與絕大多數服務器的連接沒有完成。該工具交錯調用連接以避免創建看起來像SYN氾濫的內容。它連接到一臺約100毫秒的服務器。我也有一個檢查,以確保FD_SETSIZE不被違反。我從其他人那裏得到的軼事證據表明,在後來的Windows版本上,這種行爲更好,但無法驗證。在windows XP上使用select()在許多非阻塞連接TCP套接字上錯過連接
我已經使用WinDump驗證syn包是否正在發送,並且我可以看到ack包返回,但select()一直返回零,並且代碼根本無法連接到大多數服務器存在,我可以在Linux上使用相同的代碼進行連接。
有沒有人看到或解決了許多非阻塞連接的任何類似問題,並在Windows XP上選擇?
我從來沒有做過這樣的事情,但是你可以將工作分成多個流程嗎? – 2011-03-27 22:44:15
如果沒有看到您的選擇處理,很難給出答案。但是你應該檢查一下,你是否獲得了每個選擇回報的所有接受的連接。您可能需要檢查多次FD_IS_SET。 – harper 2011-03-28 04:46:19