2012-07-26 56 views
3

我正在開發管理一個套接字的客戶端應用程序。我正在使用IOCP來管理異步I/O。如何處理多個操作發佈在同一套接字上的情況

這是從網絡編程的書報價:

所有重疊操作都保證在應用程序發出的順序執行。但是,從完成端口返回的完成通知不保證以相同的順序。也就是說,如果應用程序發佈了兩個重疊的WSARecv操作,一個具有10 KB緩衝區,另一個具有12 KB緩衝區,則首先填充10 KB緩衝區,然後填充12 KB緩衝區。應用程序的工作線程可能會在10 KB操作的完成事件之前接收來自GetQueuedCompletionStatus的12 KB WSARecv通知。當然,這只是一個問題,當多個操作發佈在套接字上時。

那麼我應該如何處理這種情況呢?

回答

3

最簡單的解決方案是,沒有多個優秀的讀或寫。所以如果通知完成,很明顯,所有的數據都被寫入套接字。如果在等待IO完成時,需要將更多數據寫入套接字,只需在IO完成時緩存該數據並寫入該數據。

如果你有一個以上未完成的IO到套接字,你必須在讀取端對它們進行排序。在寫入方面,你必須做一些記錄,以確定哪些寫入是最後一次寫入,從而完全寫入數據。另一方面,僅僅通過將數據寫入到套接字中並不意味着數據在另一側被正確接收或處理,所以必須有某種協議。如果是這樣,你可以簡單地依靠該協議,只需查找錯誤通知。

+0

+1,處理它的最簡單方法是不處理它!對於IOCP套接字類我有一個類似的方法,它使用它自己的緩衝區列表來發送以解決這個確切問題。隨着每個請求的完成,下一個請求將被傳送。所有線程安全的,當然;) – 2012-07-26 14:48:42

相關問題