2011-10-23 49 views
1

我需要啓動客戶端1000的在一個單一的過程連接,我需要解決的關鍵限制因素是驅動程序不支持ConnectEx,所以我不能有一個純IOCP解。非阻塞套接字在Windows連接不ConnectEx

我的第一個想法是處理連接的線程池,每個句柄可以使用普通連接/選擇語義處理多達64個連接,並且一旦連接繼續使用IOCP。 但這不能工作;一旦選擇正在運行,我無法將另一個套接字添加到FD_SET。所以我將不得不將套接字設置爲非阻塞,然後輪詢它們。
最好的解決方案可能是最簡單的;一個每個線程連接客戶端。假設我可以保持連接速率合理,池中的線程數可能很小。

這是一個奇怪的情況,理想情況下,驅動程序將支持ConnectEx,但它不(現在),我需要以最好的方式解決它。

還有別的辦法嗎?

回答

3

首先,有可能使用虛擬套接字(例如,連接到自己的UDP套接字)打破select,儘管這可能在您的情況下代價很高。

如果您有一個可以處理消息的窗口,則可以使用WSAAsyncSelect獲取connect的異步通知。 (注意,這也會自動使您的套接字非阻塞,這需要另一個呼叫WSAAsyncSelect和致電ioctlsocket禁用)。

由於缺乏這一點,您可以使用WSAEventSelect,不過您會發現這會限制您每次等待64個套接字(因爲這是WaitForMultipleObjects的上限)。這也會使你的套接字非阻塞,你可以類似於WSAAsyncSelect所做的那樣撤消套接字。

(作爲一個完整側面說明,您可以通過包括winsock2.h之前定義FD_SETSIZE增加select處理插槽數)

+0

WSAAsyncSelect和WSAEventSelect都有益無害。我想我會以每個連接一個線程開始,然後使用這兩個連接中的一個將連接彙集到64個組中。謝謝。 – hplbsh

+0

我沒有注意到WSAAsyncSelect使用Windows消息。討厭,但可能非常有幫助。 – hplbsh