簡體   English   中英

當TCP keep-alive中斷連接時,我會得到什么套接字錯誤?

[英]What socket error do I get when TCP keep-alive breaks the connection?

我有一組帶有保持活動的TCP套接字(間隔1分鍾),由select(2)循環控制(選擇讀取)。

  • 如果集合中的一個套接字發生了保持活動超時,那么select(2)返回錯誤嗎?
  • 哪個錯誤會read(2)返回?

  • 如果為其選擇的其中一個套接字發出錯誤信號,則select()本身不會返回錯誤。 [實際上,API無法以這種方式指示每插槽錯誤,因為在單次調用select()期間,兩個不同的套接字都可以獲取掛起錯誤。 哪一個會select()返回?]
  • 在每次迭代select()循環之后,您改為使用FD_ISSET宏在每個標記為可讀的套接字上嘗試read()
  • 每當套接字具有掛起的錯誤集時,它的讀取事件(和寫入事件)都會發出信號,並且select()返回,這樣您就可以立即獲取由於保持活動而導致的超時錯誤。 請注意,選擇標記套接字以進行讀取並不表示存在要讀取的數據,只表示讀取的嘗試不會阻止。 如果套接字有待檢索的掛起錯誤,則讀取不會阻止。 read(2)write(2)都會在嘗試處理任何數據之前首先檢索套接字上的任何掛起錯誤。

    當對具有O_NONBLOCK clear的輸入函數的調用不會阻塞時,該函數將成功傳輸數據時,應認為描述符已准備好讀取。 (該函數可能返回數據,文件結束指示或除了表示被阻止的錯誤之外的錯誤,並且在每種情況下,描述符都應被視為已准備好進行讀取。)[ POSIX:select() ]

  • 最后,返回了什么錯誤? 至關重要的是,這取決於保持活動失敗的方式。 如果另一端完全消失,你會得到ETIMEDOUT 如果發生數據包傳遞錯誤,您可以通過它來實現(因此,如果保持活動數據包獲得ICMP錯誤回復,例如“主機無法訪問”, EHOSTUNREACH發送EHOSTUNREACH )。 [有關這些案例的更多詳細信息,請參閱Stevens,“Unix網絡編程,第1卷”。]

select()FDSET中設置一個位,指示哪個套接字已觸發。 使用FD_ISSET宏來確定要求服務的套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM