2009-08-05 61 views
2

我需要一個客戶端網絡線程,以便能夠對要傳輸的新消息以及網絡上新數據的接收做出響應。我希望避免這個線程執行輪詢循環,而只是根據需要進行處理。如何讓Win32線程在工作隊列和套接字上等待?

的情況如下:

客戶端應用程序需要通過一個協議,該協議在很大程度上進行通信的服務器,但不是完全同步的。通常,客戶端向服務器發送消息並阻塞,直到收到響應。

服務器可能異步處理客戶端請求,在這種情況下,對客戶端的響應不是結果,而是處理已開始的通知。在服務器完成處理客戶端請求時,結果消息將在某個時間點發送給客戶端。

異步結果通知可以隨時到達客戶端。這些通知在收到時需要處理,即只有當客戶端再次發送時才能處理積壓。

客戶端網絡線程接收並處理來自服務器的通知,並從客戶端傳輸傳出消息。

爲了達到這個目的,我需要做一個線程喚醒來執行處理,無論是在接收到網絡數據還是當一個要發送的消息被排入輸入隊列時。

線程如何喚醒來執行處理入隊的工作項或來自套接字的數據?

我主要對使用普通的Win32 API感興趣。

一個簡單的例子或相關教程將非常歡迎!

回答

5

I/O完成的替代套接字的端口使用WSAEventSelect將事件與套接字關聯。然後,正如其他人所說的,只需要使用另一個事件(或某種可等待的句柄)來指示何時將某個項目添加到輸入隊列中,並使用WaitForMultipleObjects等待這兩種事件。

+1

+1;解決問題即使它不能很好地擴展(有時我會得到一個'IOCP是唯一的解決方案'的思路;而且通常實現解決方案要容易得多)。 – 2009-08-11 20:23:21

2

您可以設置爲手柄的I/O完成端口,並有完成端口的線程等待:

其實,你可以有多個線程等待的端口(每個處理器一個線程通常工作正常)。

+0

+1 - 邁克爾沒有說的是,一旦你的I/O套接字通過I/O完成端口進入,沒有什麼能阻止你發佈你自己的完成值到端口來處理你的工作項目。所以你的線程可以喚醒並處理插座事件或工作項 - 這幾乎是你要求的:) – 2009-08-05 21:28:40

0

好吧,如果兩個對象都有標準的Windows句柄,那麼你可以讓你的客戶端調用WaitForMultipleObjects來等待它們。

您可能想要將網絡端口的服務分解到其自己的線程中。這可能會大大簡化事情。但是,如果你最終不得不在新線程和主線程之間同步其他內容,它將無濟於事。

2

繼續從邁克爾的建議,我有一些免費的代碼,提供了IO完成端口樣式的插座的東西框架;它也包含一個基於IOCP的工作隊列。你應該能夠從中獲得一些東西來解決你的問題here