如何偵測撥號網路已斷線? |
尚未結案
|
kadlac
一般會員 發表:18 回覆:30 積分:9 註冊:2004-07-23 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
kadlac:Form1上一個Button,三個Label: #include "wininet.h" void __fastcall TForm1::Button1Click(TObject *Sender) { // 檢查連線狀態 bool TF=true; DWORD dwFlag; try { InternetGetConnectedState(&dwFlag, 0); } catch(...) { TF=false; } if (TF) { // Test Connection via Lan? // INTERNET_CONNECTION_LAN = 2; if (dwFlag & INTERNET_CONNECTION_LAN) { Label1->Caption="On-Lan_"; } else { Label1->Caption="Off-Lan_"; } // Test Connection via Modem? // INTERNET_CONNECTION_MODEM = 1; if (dwFlag & INTERNET_CONNECTION_MODEM) { Label2->Caption="On-Modem_"; } else { Label2->Caption="Off-Modem_"; } // Test Connection on line? if (InternetGetConnectedState(NULL, 0)) { Label3->Caption="On-Line"; } else { Label3->Caption="Off-Line"; } } } 參考: http://delphi.ktop.com.tw/topic.php?topic_id=59506 WinInet.DLL的InternetGetConnectedState函數發生Link問題 答題得分者為:RaynorPao (1)除了要先 #include "wininet.h" 之外,還要記得把以下的檔案「Add」到你 的專案裡面 C:\Program Files\Borland\CBuilder6\Lib\Psdk\wininet.lib (2)如何「Add」到你的專案裡面?只需要在 BCB 開發環境中按「View/Project Manager」出現「Project Manager」Dialog,然後利用滑鼠點選你的專案樹 狀結構按右鍵,選擇「Add」,把 (1) 中的檔案加入就可以了 請參考!Andy Chang
------
Andy Chang |
kadlac
一般會員 發表:18 回覆:30 積分:9 註冊:2004-07-23 發送簡訊給我 |
感謝 Andy 兄... (1) 小弟試了一下, INTERNET_CONNECTION_MODEM 可以顯示目前 Modem 連線狀態, 但這個連線狀態並不能反映實體的狀態, 例如 ,將 Modem 的Power 關掉 ,INTERNET_CONNECTION_MODEM 仍會 Show 出 Modem 是 On 的狀態
(2) 若要偵測撥號連線現在狀態 , 似乎需要主動偵測的機制才行?
如 RaynorPao 兄提到的 "如何程式判斷網路線是否Plug "
http://delphi.ktop.com.tw/topic.php?topic_id=45232 (3) 我要寫的程式會同時使用撥號連線及Ethernet 網路連線 ,而撥號網路中斷時必須能夠及時偵測出來.
感謝您的幫忙!
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 感謝 Andy 兄... (1) 小弟試了一下, INTERNET_CONNECTION_MODEM 可以顯示目前 Modem 連線狀態, 但這個連線狀態並不能反映實體的狀態, 例如 ,將 Modem 的Power 關掉 ,INTERNET_CONNECTION_MODEM 仍會 Show 出 Modem 是 On 的狀態 (2) 若要偵測撥號連線現在狀態 , 似乎需要主動偵測的機制才行? 如 RaynorPao 兄提到的 "如何程式判斷網路線是否Plug " http://delphi.ktop.com.tw/topic.php?topic_id=45232 (3) 我要寫的程式會同時使用撥號連線及Ethernet 網路連線 ,而撥號網路中斷時必須能夠及時偵測出來. 感謝您的幫忙!kadlac:掛一個多執行緒或是以Timer定時檢查! 請參考! Andy Chang
------
Andy Chang |
kadlac
一般會員 發表:18 回覆:30 積分:9 註冊:2004-07-23 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
kadlac:試試這個 #includeAndy Chang
------
Andy Chang |
kadlac
一般會員 發表:18 回覆:30 積分:9 註冊:2004-07-23 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
kadlac:參考下面文件看看對你是否有用! 原文為簡體! 撥號上網IP位址的檢知 作者: 王准 ,如轉載請保證本文檔的完整性,並注明出處。 歡迎光臨 C Builder 研究,http://www.ccrun.com/doc/go.asp?id=195 ---- 隨著INTERNET在世界範圍內的迅速普及,上網的人數也越來越多。其中,絕大多數人是通過普通電話線撥號上網的。 我們知道,每一臺上網的電腦,不論是用何種方式上網,都被分配了一個或多個獨立無二的IP地址。對於撥號上網的用戶, 一般是由其ISP在其每次撥號上網時動態分配一個IP位址,這個位址可能每次都不相同(其原因主要是為了充分利用有限資源)。 那麼,我們能否通過某種方法隨時方便地檢知自己上網時的IP地址呢?答案是肯定的。 下面我們就用C BUILDER編制一個小巧的程式來實現這種功能。(注:本程式在局域網中也同樣能運行) ---- 首先用BCB的FILE功能表下的New Application創建一個新專案,取名為IPcheck.bpr。 ---- 然後,在表單FORM1上添加五個標簽(LABEL)和兩個按鈕(BUTTON),如圖所示。 ---- 接下來,雙擊表單的OnCreate事件,在其中加上以下程式: void __fastcall TForm1::FormCreate(TObject *Sender) { WSAData wsaData; if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) { //初始化WINSOCK調用 MessageBox(NULL,"Wrong WinSock Version","Error",MB_OK); return ; } Refresh1Click(Sender); //程式一開始,就調檢知IP地址 } // 再雙擊Refresh(Button1)按鈕,在其中加上以下程式 void __fastcall TForm1::Refresh1Click(TObject *Sender) //刷新IP地址 { char HostName[80]; LPHOSTENT lpHostEnt; struct in_addr addr[2]; //本程式假設主機不是多宿主機,即最多只有一塊網卡和一個動態IP for (int i=0; i< 2; i ) { memset(&addr[i],0,sizeof(in_addr)); //對in_addr結構清0,以利後面填寫 } if (gethostname(HostName,sizeof(HostName))==SOCKET_ERROR) { // 得到本主機名 MessageBox(NULL,"Can't getting local host name.","Error",MB_OK); return ; } Label3->Caption=HostName; lpHostEnt=gethostbyname(HostName);//利用得到的主機名去獲得主機結構 if (!lpHostEnt) { MessageBox(NULL,"Yow! Bad host lookup.","Error",MB_OK); return ; } for (int i=0; lpHostEnt- >h_addr_list[i]!=0; i ) { //從主機位址表中得到IP位址 memcpy(&addr[i],lpHostEnt- >h_addr_list[i],sizeof(in_addr)); } Label4- >Caption=inet_ntoa(addr[0]); Label5- >Caption=inet_ntoa(addr[1]); } // 再雙擊Close(Button2)按鈕,在其中加上以下程式 void __fastcall TForm1::Button2Click(TObject *Sender) { WSACleanup(); //釋放WINSOCK調用 Close(); } ---- 最後,不要忘了在程式頭部加上#includeAndy Chang
------
Andy Chang |
kadlac
一般會員 發表:18 回覆:30 積分:9 註冊:2004-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |