怎樣實時判斷socket鏈接狀態?
12-28
就是非正常情況下,某一方突然斷網了,另一方怎麼能實時知道socket已經斷開鏈接了呢
特別是中間有中轉的網路環境下(比如某些防火牆策略),造成連接只剩下「半段」……確實無法收到什麼包的。
所以,還是自己在應用層面加個心跳。你要求「實時」,這個也挺難。但通常的網路業務能在數秒內得知連接斷開就可以滿足要求了。
如果對端非正常關閉,分幾種情況:
1:如果本級網路端收到rst之類的包,那在應用層應該能收到hup或者err等錯誤,如果你正在select/poll/epoll/recv等操作,那你是可以實時知道的。
2:如果對端沒有發這樣的包,那你是不能實時知道的。
3:要想知道的話,就只能主動發包去探測。
- 對端正常close socket,或者進程退出(正常退出或崩潰),對端系統正常關閉
這種情況下,協議棧會走正常的關閉狀態轉移,使用epoll的話,一般要判斷如下幾個情況
- 處理可讀事件時,在循環read後,返回結果為0
- 處理可寫事件時,write返回-1,errno為EPIPE
- EPOLLERR或EPOLLHUP或事件
- 對端非正常斷開,比如伺服器斷電,網線被拔掉
這種情況下,協議棧無法感知,SO_KEEPALIVE這個選項的超時事件太長並不實用,一般還是以應用層的heartbeat來及時發現
推薦閱讀:
※leader/follower, 半同步半非同步 和 事件驅動的關係是什麼?
※你用socket寫過什麼有趣的程序?
※Linux中本機和本機Socket通信會走網卡嗎?
TAG:Socket |