《網絡編程釋疑之:TCP半開鏈接的處理》這篇文章主要講述了網絡異常的出現、以及如何在服務端解決存在的網絡異常。同時,客戶端可否及時檢測到自身的網絡異常(好比網絡禁用,網線斷開......)也一樣影響着客戶端的正常邏輯,下面我就經過本身的實驗和實踐來給你們說明下。html
場景是這樣的,客戶端和服務端創建起一個長鏈接,而且經過一個心跳來維持上線狀態、同時也爲了解決上面所說的TCP半開鏈接問題。客戶端在自身出現網絡異常的狀況下下線,可是一旦自身網絡恢復要自動恢復此前的正常邏輯。這種狀況在現實場景中有不少,好比底層協議爲TCP的即時聊天軟件在自身網絡異常的狀況下掉線,一旦網絡恢復就自動上線,還有其餘不少的基於TCP自動重連應用。這樣,要求咱們能及時快速的響應到網絡異常並開始新的自動重連動做。linux
固然,咱們能夠從操做系統的層次去迅速響應到網絡異常(好比網絡禁用,網線斷開...),可是我目前還沒找到特別好的方案,望有過實踐的朋友能夠指導一二。我便退一步選用了在網絡應用層進行這種網絡異常的檢查,在這個過程當中選用了libevent網絡庫的編程
void bufferevent_setcb (struct bufferevent *bufev, bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg)
windows
方法,利用eventcb回調來響應網絡關閉或異常事件。之因此寫這篇文章,就是由於在這過程當中發現了一些不一樣的網絡異常行爲致使的處理不一樣,甚至在不一樣的操做系統下也有不一樣。網絡
禁用網絡會立馬響應eventcb回調,對應的事件是BEV_EVENT_ERROR
。socket
而斷開網線不會立馬響應eventcb回調,而是在下一次利用此socket進行數據操做時響應eventcb回調,對應的事件爲BEV_EVENT_EOF
。ide
禁用網絡和斷開網線都不會響應eventcb回調,須要本身去處理關閉socket描述符並清理響應libevent的資源。spa
奇怪的是同是linux內核,可是在禁用網絡和wifi斷開狀況下的處理卻和windows系統相似。操作系統
另外分享給你們一篇文章《網絡異常檢查》code