WSASend體會以及WSAENOBUFS錯誤思路

1. 投遞任意大小的緩衝區它都是立即返回
2. WSASend返回成功只是表示將數據拷貝到了緩衝區
3. GetQueuedCompletionStatus返回成功只表示發送成功,並不代表對方成功接收到數據
4. WSAWaitForMultipleEvents WSAGetOverlappedResult 3 類似

個人結論:網上的宣稱投遞0字節WSASend並沒有什麼卵用。WSASend返回WSAENOBUFS不用理會,前提是你必須把發送緩衝列表裏的數據放在GetQueuedCompletionStatus返回成功後刪除,而不是在調用WSASend後刪除,返回WSAENOBUFS即表示這次的發送失敗。但上次發送的數據仍然在發送緩衝列表裏。我們可以稍後重新發送

對於WSAENOBUFS的個人想法:可以使用一個map<SOCKET, char>的對象,默認值爲0x00,如果出現WSAENOBUFS錯誤則將此客戶端的加入map並將值 |= 投遞的類型(默認爲枚舉),然後在WSARecv或者WSASend投遞後在GetQueuedCompletionStatus返回成功後(返回成功即表示緩衝區空出了一塊空間)檢查此map是否爲空,如果不爲空則重新投遞該對象的的send或者recv操作。

其次對於WSARecv操作:WSARecv是可以投遞0字節的,並且只會在緩衝區有數據的情況下返回,所以爲了減少WSAENOBUFS發生的概率是可以投遞0字節的WSARecv的。

浪費了好多時間在測試上面。。希望大家有心得體會可以交流一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章