C++ IOCP問題備註(955, 1236)

[1236錯誤] 狀況以下: 1.client鏈接server
      2.client發送消息到server
      3.client使用closesocket(sock);
      4.server接收到關閉socket消息 (lpNumberOfBytesTransferred爲0,  注意:若是客戶端發送的是空消息一樣爲零) 而後使用closesocket函數關閉了這個客戶端的socket
      5.這時候狀況發生了,GetQueuedCompletionStatus函數返回false而且GetLastError() == 995 或者 1236網絡

    緣由以下: 通過本人測試發現, 若是不向系統投遞這個客戶端recv操做, 那麼客戶端使用closesocket函數服務端是沒法接收到消息的, 那麼說明closesocket對於服務端來講也是一個特殊的recv操做,
    可是投遞了接收操做卻會出現995或者1236錯誤,995錯誤的說明是停止I/O操做引發的,可是咱們已經接收到了客戶端的close消息, 因此才說closesocket是特殊的recv操做, socket

      

      那麼1236錯誤呢? 最開始我是在網絡上查找這種錯誤說明,可是都沒有太大的幫助, 直到我找到了一篇文章,上面是這樣說的函數

    咱們主要看第二條消息, 和咱們的995錯誤是否是很相似,那麼咱們就能夠假設是由於投遞的I/O操做返回引發的測試

  解決方法:
    既然是由於I/O操做未完成引發的,那麼咱們何不讓它完成,這樣就從根源上解決了問題發生,通過本人測試, 咱們只須要讓客戶端再發一次消息,而後服務端再關閉客戶端的socket, 這時候既沒有出現995錯誤,也沒有1235錯誤, 完美解決。
    第二種方法: 若是是995錯誤咱們可使用PostQueuedCompletionStatus從新投遞一次IO操做讓咱們的工做者線程活過來,可是這個方法對1236錯誤沒用, 那麼咱們就只能重啓工做者線程了。至此,問題解決線程

相關文章
相關標籤/搜索