[英]why TCP keep-alive packet doesn't trigger I/O event? Is it because no payload or sequence number is 1 less than sequence number of connection
[英]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.