網路狀態檢測方法分析

2021-07-01 18:33:55 字數 3519 閱讀 8346

現在網上有很多種針對網路狀態檢測的方法,在此做乙個簡單的分析和總結。

總體來說一共有七種。

一、 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...