能順利ping通外網網址,說明你的計算機與外網網站是互通的。 之所以socket TCP連接失敗或者UDP無響應,原因可以從以下三個環節中查找: 1)本機(你的計算機) 防火牆是否屏蔽掉你使用的端口? 2)公司外網路由(或網關) 路由(網關)是否開放了你所指定的協議(TCP或UDP)以及端口? 3)外網網站 外網網站是否允許使用你所指定的協議(TCP或UDP)以及端口? 上述三個環節,只要有一個出問題,都會導致Socket連接失敗,或UDP無響應!
下面是別處文章的內容:點擊打開鏈接
利用libevent進行網絡異常檢查(客戶端能及時檢測到自身的網絡異常)
《網絡編程釋疑之:TCP半開連接的處理》這篇文章主要講述了網絡異常的出現、以及如何在服務端解決存在的網絡異常。同時,客戶端能否及時檢測到自身的網絡異常(比如網絡禁用,網線斷開......)也同樣影響着客戶端的正常邏輯,下面我就通過自己的實驗和實踐來給大家說明下。
場景是這樣的,客戶端和服務端建立起一個長連接,並且通過一個心跳來維持上線狀態、同時也爲了解決上面所說的TCP半開連接問題。客戶端在自身出現網絡異常的情況下下線,但是一旦自身網絡恢復要自動恢復此前的正常邏輯。這種情況在現實場景中有很多,比如底層協議爲TCP的即時聊天軟件在自身網絡異常的情況下掉線,一旦網絡恢復就自動上線,還有其他很多的基於TCP自動重連應用。這樣,要求我們能及時快速的響應到網絡異常並開始新的自動重連動作。
當然,我們可以從操作系統的層次去迅速響應到網絡異常(比如網絡禁用,網線斷開...),但是我目前還沒找到特別好的方案,望有過實踐的朋友可以指導一二。我便退一步選用了在網絡應用層進行這種網絡異常的檢查,在這個過程中選用了libevent網絡庫的
void
bufferevent_setcb (struct bufferevent *bufev, bufferevent_data_cb readcb, bufferevent_data_cb writecb, bufferevent_event_cb eventcb, void *cbarg)
方法,利用eventcb回調來響應網絡關閉或異常事件。之所以寫這篇文章,就是因爲在這過程中發現了一些不同的網絡異常行爲導致的處理不同,甚至在不同的操作系統下也有不同。
Windows系統
禁用網絡會立馬響應eventcb回調,對應的事件是BEV_EVENT_ERROR
。
而斷開網線不會立馬響應eventcb回調,而是在下一次利用此socket進行數據操作時響應eventcb回調,對應的事件爲BEV_EVENT_EOF
。
Linux系統(CentOS)
禁用網絡和斷開網線都不會響應eventcb回調,需要自己去處理關閉socket描述符並清理響應libevent的資源。
Android系統
奇怪的是同是linux內核,但是在禁用網絡和wifi斷開情況下的處理卻和windows系統類似。
另外分享給大家一篇文章《網絡異常檢查》