我正在實現一個客戶機/服務器對,通過TCP/IP套接字進行通信,在Windows中使用帶有完成例程的重疊IO進行通信。調試通過兩個VirtualBox虛擬機完成(客戶端在一個,服務器在另一個)。 CPU是一個四核。WSASend,WSARecv完成例程安排問題
在客戶端上的操作順序基本是:
- 問題一個電話的WSARecv(不會完全作爲尚未)。
- 使用數據包發出WSASend調用。服務器將通過相同的套接字發送回覆。
- 一旦WSASend調用的完成例程被執行,數據包被放置在等待應答隊列中。
- 一旦WSARecv調用的完成例程執行(從收到的服務器回覆),代碼將嘗試在隊列中查找與此回覆相關的數據包。
- 發出WSARecv調用(至今尚未完成)。
- 從第二步開始重複。
在服務器上的操作順序基本是:
- 問題一個電話的WSARecv(不會完全作爲尚未)。
- 執行WSARecv調用的完成例程(來自接收到的客戶端的數據包)後,該數據包將在輔助線程中處理。
- 發出WSARecv調用(至今尚未完成)。
- 一旦輔助線程完成,回覆被髮送到客戶端,在主線程上發出WSASend調用。
- 從第二步開始重複。
我遇到的問題是,有時會在客戶端收到回覆,而在等待回覆隊列中沒有相應的數據包。作爲調試工作的一部分,我有兩個問題:
1)可以想象,有一個未決的WSARecv調用,WSARecv的完成例程被安排在對應的WSASend的完成例程之前執行(一個發送服務器回覆的數據包)?
2)如果WSASend調用立即完成,那麼完成例程仍然計劃執行?
我正在使用WSAWaitForMultipleEvents調用作爲可警告的等待函數。