迷茫2017-04-17 13:36:43
1、 ping
的話可能會併網關屏蔽掉,比如我們這裡
2、80
端口,有些需要認證的網絡,比如ChinaUnicom
的wifi,登錄之前會把所有的80 端口DNAT
然後重定向到登入頁面,導致誤判。
3、 443
端口,一般認證的網絡不會對這個端口DNAT
,即使做了,也會導致證書錯誤,國內HTTPS
網站不多,而且百度正常情況下也會有證書錯誤。
所以建議wget/curl
某個有固定內容的HTTP
頁面,例如http://example.com/
(這個網域真的存在),然後判斷其中的內容,如果偵測到不同還可以提示使用者"您所在的網絡可能需要登入才能使用"。而且即使判斷錯了也與使用者的體驗一樣。
天蓬老师2017-04-17 13:36:43
如何偵測他是否連接到外網,這個問題本身很難解決,因為你無法定義「連接到外網」。
所以只有針對性的做法:
這是任天堂3DS的做法:
get 這個網域conntest.nintendowifi.net。如果打得開,回傳This is test.html page,那麼3DS就認為自己連網的。
整個流程包括了網域解析和http 80請求。
至於不同的環境有不同。例如哪天萬一conntest.nintendowifi.net被牆了,被禁了,這個方法就不生效。
某些網路禁ping,ping方法也不生效。
天蓬老师2017-04-17 13:36:43
就像瀏覽器上網一樣,我們取得百度的首頁的頁面看看,有沒有html字樣,百度字樣:
wget http://www.baidu.com/
會取得一個index的html。有成功,沒有就沒網。哈哈