現在網上有很多種針對網路狀態檢測的方法,在此做乙個簡單的分析和總結。
總體來說一共有七種。
一、 internetattemptconnect函式
這個函式可以說非常簡單,只是嘗試計算機連線到網路。並不考慮是用什麼方式連線。當成功連線到網路的時候,函式返回error_success,也就是0。函式的引數永遠都是0。
有一點需要注意的是,當計算機是用「小貓」也就是撥號的方式上網的時候,在執行internetattemptconnect這個函式時,會自動啟用撥號連線功能。這也就是很多軟體使用的撥號連線功能。比如foxmail和flashget。它跟ie的連網狀態有時候不統一。
example:
tchar tszdebugmsg[100] = ;
dword dwres = internetattemptconnect(0);
if (dwres != error_success )
else
outputdebugstring(tszdebugmsg);
二、 檢查遠端主機狀態函式:internetcheckconnection
這個函式的作用和ping命令是一樣的,可以檢查遠端主機是否連線。如果連線成功返回true,如果連線失敗返回false。通過上述的方法只能檢測出當前計算機是否物理聯網,即網線是否接好,網絡卡是否能順利工作,不能確定是否能夠實現獲得 internet 服務,即是否能和 isp 進行 internet 連線。它跟ie的連網狀態有時候不統一。
缺點:如果斷網,或者對應的伺服器沒開的話,會導致等待,卡死的現象。並且在in proxy environment 下如果設定了proxy server in ie (internet option->connections->lan setting->proxy server") 獲得的返回值一直是false。(這個題一直沒找到原因,如有知道原因的還請不吝賜教o(∩_∩)o~)
example:
bool bres = internetcheckconnection(null, flag_icc_force_connection, 0);
if (!bres)
else
outputdebugstring(tszdebugmsg);
三、 internetqueryoption函式
internetqueryoption 函式的檢測結果只能表明當前的 internet 設定是可用的, 並不能表示計算機一定能訪問 internet,例如網線掉了,網絡卡突然壞了之類的錯誤就沒法檢測出來,要想檢測當前計算機是否能夠獲得 internet 服務了必須跟internetcheckconnection()兩個結合起來使用。它跟ie的連網狀態有時候不統一。
example:
byte btinetset[100] = ;
dword dwinetsetlen = 100;
bool bres = internetqueryoption(null, internet_option_connected_state, btinetset, &dwinetsetlen);
if (!bres)
else
outputdebugstring(tszdebugmsg);
四、 檢查本地網路連線狀態並取得網路連線方式函式:internetgetconnectedstate
缺點是:若當前連線不是用wininet方法建立的,則返回值可能不準確。它跟ie的連網狀態有時候不統一。
example:
bres = internetgetconnectedstate(&dwflags, 0);
if (!bres)
else
outputdebugstring(tszdebugmsg);
五、 ras 方法(remote access service)
六、 登錄檔法
七、ping命令實現
個人覺得這個方法不是非常好用,在這裡就不做贅述了。
上面的這些方法都或多或少的有些問題,下面是我自己實現的來測試網路狀態的函式,它跟ie的連網狀態是統一。
(1) internetstatus.h
#pragma once
#include // test url
#define intenet_status_testurl_ms text("")
#define intenet_status_testurl_asus_aprpserver text("")
// user agent
#define user_agent text("sp_inetstatus/1.0")
bool isinternetconnected(void);
(2) internetstatus.cpp
// include
#include "internetstatus.h"
#include #include // lib
#pragma comment(lib,"wininet.lib")
// error msg length
#define debugrmsg_len 100
// error msg
tchar tszdebugmsg[debugrmsg_len] = ;
// my_internetopenurl sub method
bool my_internetopenurl(hinternet hinternet, lpctstr lpszurl)
// close internet handle
internetclosehandle(hconnectopenurl);
_stprintf_s(tszdebugmsg, debugrmsg_len, text("\r\n internetopenurl %s sucess~~ \r\n"), lpszurl);
outputdebugstring(tszdebugmsg);
return true;
}// isinternetconnected method
bool isinternetconnected()
bool bres = my_internetopenurl(hinternetopen, intenet_status_testurl_ms);
if (!bres)
}end_return:
// close hinternet
if (hinternetopen)
return brtninf;
}
(3) how to using.
#include "internetstatus.h"
int _tmain(int argc, _tchar* argv)
}
有什麼問題大家可以共同討論o(∩_∩)o~
檢測網路狀態
搞了一下午,什麼internetcheckconnection,internetconnect,internetqueryoption試了一堆,發現這些函式要不沒用,要不用起來很麻煩,根本檢測不了網路的狀態。因為機子上本來有wifi和本地網路,所以就用socket了 這是朋友給的乙個函式,方便以後使...
iOS檢測網路狀態
很多任務程多需要用到網路,時刻需要對網路鏈結進行判斷,下面介紹怎麼使用網路鏈結第三方,進行判斷網路以及判斷是wifi,4g網路等等 少說廢話上 import viewcontroller.h import reachability.h inte ce viewcontroller property ...
iOS 檢測網路狀態
1.ios平台是按照一直有網路連線的思路來設計的,開發者利用這一特點創造了很多優秀的第三方應用。大多數的ios應用都需要聯網,甚至有些應用嚴重依賴網路,沒有網路就無法正常工作。2.在你的應用嘗試通過網路獲取資料之前,你需要知道當前裝置是否知道連線上了網路,甚至有時候你可能還需要知道當前網路是由wif...