2012-12-17 75 views
1

在Linux上我嘗試以下步驟:爲什麼關機報告錯誤?

  1. 創建TCP套接字,並連接到任何HTTP服務器
  2. 發送HTTP請求數據
  3. 與SHUT_WR
  4. 關機寫從套接字讀取拿到HTTP響應
  5. 關機閱讀SHUT_RD
  6. 關閉套接字

此錯誤發生在第5步,errno = ENOTCONN。當我在閱讀EOF之後嘗試關機寫入時,同樣的錯誤觸及我。這是預期的嗎?

+1

如果你得到EOF一邊讀書,連接必須是由服務器(TCP FIN在進行最後的塊中的數據包)關閉。我不認爲你真的需要完成第5步。 –

+0

是的,關閉讀取是不必要的,但如果我們這樣做,它不會違反TCP協議。只是想知道爲什麼tcp棧聲稱錯誤? – skygragon

+0

因爲連接已經結束。將它與線捕捉相關聯,在第二次關閉(2)之前,你可能會看到'FIN'來自另一端。 –

回答

0

在步驟4,如果你環繞在的recv()或閱讀(),直到它返回0,那麼你已經消耗的插座接近的另一半。除了這次是由遠端發起的。這可能解釋了爲什麼第5步會返回一個錯誤 - 由於遠程終端已關閉連接的那一側,因此沒有任何關閉。

在任何情況下,你不需要第5步,因爲你在步驟6中的「關閉」將關閉TCP連接的其餘部分關閉套接字,並關閉套接字文件描述符。這對於非持久性連接完全沒有問題 -

相關問題