解決accept返回WSAEINTR(10004)的錯誤

現象:阻塞狀態的accept返回了10004,也就是WSAENTER。

解決:
1、查MSDN上的說明是"A blocking Windows Sockets 1.1 call was canceled through WSACancelBlockingCall",毫無思路。
2、在網上沒有找到直接的幫助,倒是看到有幾個例子對於accept遇到該問題後沒有處理,直接continue。
3、本着“死馬當活馬醫”的態度,用這種方法試了一下,出現新的錯誤10093,與socket庫的初始化有關。
4、從該錯誤中獲得啓發,看了一下處理數據的線程,其中在recv失敗後會調WSACleanup,這點是問題的根本原因。(服務端程序原來很簡單,是單線程的,這樣做出錯處理問題不大,但改成多線程後沒有注意這一點)

結論:
1、整個錯誤是由於客戶端裏某個線程結束導致連接斷開,服務端裏某個線程recv失敗,之後調WSACleanup,結果導致主線程accept錯誤。


發佈了132 篇原創文章 · 獲贊 10 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章