如何檢測電腦的 Internet 連接狀態 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 如何檢測電腦的 Internet 連接狀態 檢測電腦是否聯網比較簡單的做法可以通過一個 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('http://www.yahoo.com/', 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;
var
ConnectState: 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。 對於 Windows 2000 中網路掉線的即時檢測,猜想是和底層的中斷或者某個 Service 有關,
但因?本人才疏學淺,一直沒能搞懂該怎樣做,還請知情的大俠不吝賜教,先在此謝謝您了。 作者:940801 ,Mail:l940801@yahoo.com
保留一切版權,歡迎轉貼。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
8866
中階會員 發表:27 回覆:147 積分:69 註冊:2002-10-14 發送簡訊給我 |
引言: 此為轉貼資料 如何檢測電腦的 Internet 連接狀態 檢測電腦是否聯網比較簡單的做法可以通過一個 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('http://www.yahoo.com/', 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; var ConnectState: 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。 對於 Windows 2000 中網路掉線的即時檢測,猜想是和底層的中斷或者某個 Service 有關, 但因?本人才疏學淺,一直沒能搞懂該怎樣做,還請知情的大俠不吝賜教,先在此謝謝您了。 作者:940801 ,Mail:l940801@yahoo.com 保留一切版權,歡迎轉貼。我提供另一種方法 , 用以下 3 個function 可以改變 IP Address, Gateway , DNS , DHCP 設定 ......... 喔 !!! SetupDiGetClassDevs() GetDeviceInfo() StateChange() 以及 CurrentState 可測知目前 "網卡" 的狀態 ! |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
站長試了一下
好像只有這一個才可以用喔
procedure TForm1.Button1Click(Sender: TObject);
begin
if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then
edit1.text:= 'Connected'
else
edit1.text:= 'Disconnected';
end; ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |