全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2912
推到 Plurk!
推到 Facebook!

如何偵測撥號網路已斷線?

尚未結案
kadlac
一般會員


發表:18
回覆:30
積分:9
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-07 16:58:20 IP:211.72.xxx.xxx 未訂閱
您好! RaynorPao 兄曾提到如何程式判斷網路線是否Plug http://delphi.ktop.com.tw/topic.php?topic_id=45232 然而小弟使用撥號網路連線,有時撥號網路已斷線,但是IP 還在, 如何以程式自動偵測此一現象?
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-07 17:55:03 IP:221.169.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-08 22:10:05 IP:211.72.xxx.xxx 未訂閱
感謝 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-08 22:14:25 IP:221.169.xxx.xxx 未訂閱
引言: 感謝 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-09 09:03:06 IP:211.72.xxx.xxx 未訂閱
謝謝! 將Modem 的Power 關掉,或是將連接線拔掉, INTERNET_CONNECTION_MODEM 仍會 Show 出 Modem 是 On 的狀態, 此時使用Timer 或是執行緒定時檢查, 仍會判斷 Modem 是 On 的狀態,如此還是無法偵測出 Modem 的實際狀態.....
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-09 14:01:35 IP:221.169.xxx.xxx 未訂閱
kadlac:試試這個
#include 
BOOL WINAPI IsModemOnline()
{
 RASCONN ras[20];
 DWORD dSize,dNumber,dCount;
 ras[0].dwSize = sizeof(RASCONN);
 dSize = sizeof( ras );
 if( RasEnumConnections( ras, &dSize, &dNumber ) == 0 )
  if(dNumber>0)
    return true;
 return false;
}    
Andy Chang
------
Andy Chang
kadlac
一般會員


發表:18
回覆:30
積分:9
註冊:2004-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-10 17:09:23 IP:211.72.xxx.xxx 未訂閱
謝謝Andy 兄契而不捨的幫忙...    我用您說的 RasEnumConnections 來偵測 還是沒辦法偵測出"撥號網路已斷線但是IP 還在" 的狀況    真是一個頭兩個大....
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-10 17:57:34 IP:221.169.xxx.xxx 未訂閱
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(); 
}     ---- 最後,不要忘了在程式頭部加上#include.....哦。     ---- 好了,程式完成了,編譯後就可運行了。本程式在中文WIN95/NT4.0下編譯通過。    全文完!請參考!    
Andy Chang
------
Andy Chang
kadlac
一般會員


發表:18
回覆:30
積分:9
註冊:2004-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-15 13:24:38 IP:211.72.xxx.xxx 未訂閱
感謝Andy 兄熱情幫忙, 幾種 Solution 都非常精采...
系統時間:2024-05-04 7:30:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!