假設我有兩個程序,一個客戶端和一個服務器,並且我在同一臺計算機上運行客戶端和服務器(所以速度非常快),並且說客戶端套接字的接收緩衝區是空的,並且服務器不會向客戶端發送任何數據,除非客戶端告訴服務器這樣做。在這種情況下,WSASend()和WSARecv()的完成數據包的順序是什麼?
現在,在客戶端,我打電話WSASend()
然後之後我打電話WSARecv()
:
WSASend(...); // tell the server to send me some data
WSARecv(...);
所以在上面的代碼中,WSASend()
告訴服務器發送一些數據到客戶端(比如:字符串"hello"
)。
現在經過一段時間後,兩個完成的數據包將被放置在完成端口:
第一個完成數據包是
WSASend()
(告訴我,數據 已被放置在客戶端套接字的發送緩衝區)。第二完成數據包是用於
WSARecv()
(告訴我,數據 已放置在我傳遞給WSARecv()
當我 把它稱爲緩衝液)。
現在我的問題是:有沒有可能爲WSARecv()
完成數據包被放置在完成端口的完成數據包之前WSASend()
(所以當我打電話GetQueuedCompletionStatus()
我將獲得WSARecv()
先完成數據包)?
是的,這可能(但可能性極低) - 但是對於你將這個數據包放入iocp的命令有什麼不同?你不能依賴這個 – RbMm