delphi 判斷網路是否連線正常

2021-06-19 09:42:15 字數 2845 閱讀 1201

檢測計算機是否聯網比較簡單的做法可以通過乙個 win32 internet(wininet) 函式 internetcheckconnection來實現;

這個函式的功能是檢查是否能夠建立 internet 連線。

它的實現是在 %systemroot%\system32\wininet.dll 中,delphi 呼叫宣告在 wininet.pas 中,

其 api 宣告如下:

bool internetcheckconnection(

in lpcstr lpszurl,

in dword dwflags,

in dword dwreserved

);引數的意義是:

lpszurl: 需要測試能否建立連線的 url 位址,可以為空;

dwflags: 目前只能是 flag_icc_force_connection(這個常量 delphi 中沒有宣告,其值為 $00000001);

dwreserved: 目前只能為 0。

呼叫的說明:

如果 lpszurl 是非空的,windows 從中解析出 host 名然後 ping 這個指定的 host。

如果 lpszurl 是空的,並且 wininet 內部伺服器的 database 中有乙個關於最近的 server 的紀錄,windows 就從這條紀錄中解析出 host 名然後 ping 它。

如果能夠成功的連線返回 true,否則返回 false;

以下是乙個判斷當前計算機是否聯網的例子:

procedure tform1.button1click(sender: tobject);

begin

if internetcheckconnection('', 1, 0) then

edit1.text:= 'connected'

else

edit1.text:= 'disconnected';

end;

通過上述的方法只能檢測出當前計算機是否物理聯網,即網線是否接好,網絡卡是否能順利工作,不能確定是否能夠實現獲得 internet 服務,即是否能和 isp 進行 internet 連線。

這時可以通過另乙個 win32 internet(wininet) 函式 internetqueryoption 來檢測;

這個函式的功能是查詢指定 internet 控制代碼的狀態、選項。

其 api 宣告如下:

bool internetqueryoption(

in hinternet hinternet,

in dword dwoption,

out lpvoid lpbuffer,

in out lpdword lpdwbufferlength

);引數的意義是:

hinternet:查詢物件的 internet 控制代碼(全域性查詢時為 nil),

dwoption:查詢的專案;

lpbuffer:返回的查詢結果;

lpdwbufferlength:查詢結果的位元組長度(包括 in 和 out);

查詢成功返回 true,否則返回 false;

我們要查詢當前計算機的 internet 連線狀態時可以使用查詢專案 internet_option_connected_state,

得到的 connectstate 返回值可能是以下值的乙個或幾個值之和:

internet_state_connected :$00000001 連線狀態;

internet_state_disconnected :$00000002 非連線狀態(和 internet_state_connected 對應);

internet_state_disconnected_by_user :$00000010 使用者請求的非連線狀態

internet_state_idle :$00000100 連線狀態,並且空閒

internet_state_busy :$00000200 連

接狀態,正在響應連線請求

以下是乙個判斷當前計算機是否可以獲得 internet 服務的例子:

function tform1.checkoffline: boolean;

varconnectstate: dword;

statesize: dword;

begin

connectstate:= 0;

statesize:= sizeof(connectstate);

result:= false;

if internetqueryoption(nil, internet_option_connected_state, @connectstate, statesize) then

if (connectstate and internet_state_disconnected) <> 2 then result:= true;

end;

procedure tform1.button1click(sender: tobject);

begin

if checkoffline then

edit1.text:= 'connect to isp'

else

edit1.text:= 'disconnect to isp';

end;

需要說明的是 internetqueryoption 函式的檢測結果只能表明當前的 internet 設定是可用的,

並不能表示計算機一定能訪問 internet,例如網線掉了,網絡卡突然壞了之類的錯誤就沒法檢測出來,

要想檢測當前計算機是否能夠獲得 internet 服務了必須兩個函式結合起來使用。

以上程式在 win2000, delphi5.0 下除錯通過。

最後要提醒大家注意的是在 uses 中要加上 wininet。

c 判斷網路是否連線

win32 api函式的做法 要用的函式 internetgetconnectedstate 函式原形 bool internetgetconnectedstate lpdword lpdwflags,dword dwreserved 引數lpdwflags返回當前網路狀態,引數dwreserved...

C 判斷檢測網路是否連線

完整的 using system.runtime.interopservices namespace internet public class class1 dllimport wininet.dll private extern static bool internetgetconnecteds...

linux下判斷網路是否連線

本文改寫自網上的乙個程式,原始程式中為阻塞式呼叫,而且有現成建立的過程,非常不利於整合到自己程式中,因此對原始程式進行改造,使其可以完成傳送乙個imcp包的方式來判斷網路連通,只需要呼叫改進後的 bool netisok 函式即可,該函式返回true即表示網路狀態良好,否則表示網路狀態不連同,本程式...