March 4,2006

用C++ Builder實現網路連接檢測程式

Windows系統中,我們經常用Ping.exe來測試網路的連通性。

  Ping的實現過程很簡單,該命令將引發IP層發送一個簡單的IP包,一般是32位元組。而目的方收到這個包後,將源位址和目的地址變換一下,重新發送這個包即可,當然還要加一些超時機制。

  其實,我們也可用C++ Builder NetMaster中的NMEcho控制項來實現網路連接檢測功能。


兩個RichEdit控制項:一個用於給遠端主機發送資訊,一個用於接收來自遠端主機的資訊。

  兩個CheckBox控制項:用於用戶是否自己設定埠號。

  一個Button控制項:用於執行測試。

  一個StatusBar控制項:用於顯示應用程式的狀態。

  程式實現代碼如下:

  void __fastcall TForm1::Button1Click(TObject Sender)

  { //設置NMEcho控制項的標準TCP/IP屬性

   NMEcho1-〉Host=Edit1-〉Text ;

   NMEcho1-〉TimeOut=StrToInt(Edit2-〉Text) ;

   if(CheckBox1-〉Checked)

    NMEcho1-〉Port=StrToInt(Edit3-〉Text);

   else

    NMEcho1-〉Port=7;

  //TCP/IP中Echo的默認埠號

  NMEcho1-〉ReportLevel=Status_Basic;

   NMEcho1-〉Connect(); //建立連接

   RichEdit2-〉Clear ();

   for(int i=0;i
  //RichEdit1用於給遠端主機發送資訊

  RichEdit2-〉Text=RichEdit2-〉Text +NMEcho1-〉Echo(RichEdit1-〉Lines-〉

  Strings[i]);

   NMEcho1-〉Disconnect ();

  }

  注意:在調用NMEcho控制項的Connect()方法時,應該確保在接收資料之前連接已經建立。

  當調用Connect()方法後,如果用戶輸入的是域位址而不是IP位址,且功能變數名稱伺服器成功地解析了這個功能變數名稱,將觸發控制項的OnHostResoved事件,在此事件的處理中,我們將解析成功的消息在狀態欄中顯示給用戶。具體實現代碼如下:

  void __fastcall TForm1::NMEcho1HostResolved(TComponent Sender)

  {

   StatusBar1-〉Panels-〉Items[0]-〉Text="Host Resolved!";    

  }


  如果用戶輸入的遠端主機不正確,將觸發控制項的OnInvalidHost事件,在此事件的處理中,彈出對話方塊要求用戶重新輸入遠端主機的IP位址或功能變數名稱位址,然後試圖與服務器重建連接。具體代碼如下:

  void __fastcall TForm1::NMEcho1InvalidHost(bool &&Handled)

  {

   AnsiString s;

   if(InputQuery("Invailid host!","Specify a new host:",s))

   {

    NMEcho1-〉Host=s;

    Handled=true;

   }    

  }

  建立連接後,將觸發控制項的OnConnect事件,在此事件的處理中,我們將連接成功的消息在狀態欄中顯示給用戶。具體實現代碼如下:

  void __fastcall TForm1::NMEcho1Connect(TObject Sender)

  {

   StatusBar1-〉Panels-〉Items[0]-〉Text="Echo has connected host!";

   }

  如果在調用Connect()方法後,在超時時間仍然沒有與伺服器連接,將觸發控制項的OnConnectFailed事件,在此事件的處理中,我們將連接失敗的消息顯示給用戶。具體實現代碼如下:

  void __fastcall TForm1::NMEcho1ConnectionFailed(TObject Sender)

  {

  ShowMessage("Connection failed!");    

  }

  除了NMEcho控制項可以實現以上功能外,NetMaster的NMDayTime、NMTime這兩個控制項也能實現。方法與NMEcho控制項一樣,區別是NMDayTime和NMTime這兩個控制項不用首先調用Connect()方法,它們與伺服器的連接是在使用DayTimeStr、TimeStr屬性時自動進行的.

Posted by yam_javanull at 樂多Roodo! │02:32 │回應(0)引用(0)C++
樂多分類:網路/3C 共同主題:程式設計 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/1202309