1
在Linux上我嘗試以下步驟:爲什麼關機報告錯誤?
- 創建TCP套接字,並連接到任何HTTP服務器
- 發送HTTP請求數據
- 與SHUT_WR
- 關機寫從套接字讀取拿到HTTP響應
- 關機閱讀SHUT_RD
- 關閉套接字
此錯誤發生在第5步,errno = ENOTCONN。當我在閱讀EOF之後嘗試關機寫入時,同樣的錯誤觸及我。這是預期的嗎?
在Linux上我嘗試以下步驟:爲什麼關機報告錯誤?
此錯誤發生在第5步,errno = ENOTCONN。當我在閱讀EOF之後嘗試關機寫入時,同樣的錯誤觸及我。這是預期的嗎?
在步驟4,如果你環繞在的recv()或閱讀(),直到它返回0,那麼你已經消耗的插座接近的另一半。除了這次是由遠端發起的。這可能解釋了爲什麼第5步會返回一個錯誤 - 由於遠程終端已關閉連接的那一側,因此沒有任何關閉。
在任何情況下,你不需要第5步,因爲你在步驟6中的「關閉」將關閉TCP連接的其餘部分關閉套接字,並關閉套接字文件描述符。這對於非持久性連接完全沒有問題 -
如果你得到EOF一邊讀書,連接必須是由服務器(TCP FIN在進行最後的塊中的數據包)關閉。我不認爲你真的需要完成第5步。 –
是的,關閉讀取是不必要的,但如果我們這樣做,它不會違反TCP協議。只是想知道爲什麼tcp棧聲稱錯誤? – skygragon
因爲連接已經結束。將它與線捕捉相關聯,在第二次關閉(2)之前,你可能會看到'FIN'來自另一端。 –