線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3268
推到 Plurk!
推到 Facebook!

如何檢測電腦的 Internet 連接狀態

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 13:21:28 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 如何檢測電腦的 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-28 09:47:11 IP:211.23.xxx.xxx 未訂閱
引言: 此為轉貼資料 如何檢測電腦的 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-31 16:30:40 IP:192.168.xxx.xxx 未訂閱
站長試了一下 好像只有這一個才可以用喔 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討論區站長~~~
系統時間:2024-03-29 7:10:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!