<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用Delphi完成專線狀態的探測

      [摘要]范智鑫 王毅燕 隨著計算機用戶的增多,計算機網絡越來越復雜,如何進行實時的網絡檢測成為網管人員關心的問題。實時監測可以在最早的時間內發現問題,避免網絡長時間繼線。本文介紹一種利用Delphi編寫應用...
      范智鑫 王毅燕

      隨著計算機用戶的增多,計算機網絡越來越復雜,如何進行實時的網絡檢測成為網管人員關心的問題。實時監測可以在最早的時間內發現問題,避免網絡長時間繼線。本文介紹一種利用Delphi編寫應用程序實現專線狀態探測的方法。
      實現原理
      許多人經常利用Windows中的兩條DOS命令(Ping和Tracert)來測試網絡狀態,其原理是通過向探測的節點端口發送數據包請求,然后從該端口是否應答來判斷網絡是否暢通。其實,在Windows的System目錄下有一個Icmp.dll文件,該動態鏈接庫提供了ICMP協議的所有功能,通過對該動態鏈接庫的調用可以完成發送請求和接收應答。因此,可以利用該動態鏈接庫實現專線狀態的探測。
      Icmp.dll文件內的主要調用函數如下:
      ● IcmpCreateFile: 打開一個句柄,通過該句柄發送ICMP的請求報文;
      ● IcmpCloseHandle: 關閉通過IcmpCreateFile函數打開的句柄;
      ● IcmpSendEcho:通過打開的句柄發送ICMP請求,在超時或接收到應答報文后返回。
      編程實現
      首先構造節點庫(如圖1所示),然后通過調用ICMP協議,向測試端口發送請求,如果接收到該端口的應答,則狀態為“正!保駝t,狀態為“中斷”。

      圖1
      1. 初始化WinSock,調入Icmp.dll庫
      var
       wsadata: TWSAData;
      begin
       if WSAStartup($101,wsadata) <> 0 then begin
      ShowMessage(‘Error initialising WinSock’);
        halt;
       end;
       hICMPlib ∶= loadlibrary(icmpDLL);
       if hICMPlib <> null then begin
        @ICMPCreateFile ∶= GetProcAddress(hICMPlib, ‘IcmpCreateFile’);
        @IcmpCloseHandle∶= GetProcAddress(hICMPlib, ‘IcmpCloseHandle’);
      @IcmpSendEcho∶= GetProcAddress(hICMPlib,
      ‘IcmpSendEcho’);
      if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho=Nil) then begin
      ShowMessage(‘Error loading dll functions’);
      halt;
        end;
        hICMP ∶= IcmpCreateFile;
        if hICMP=INVALID_HANDLE_VALUE then begin
      ShowMessage(‘Unable to get ping handle’);
        halt;
        end;
       end;
       else begin
      ShowMessage(‘Unable to register’+ icmpDLL);
      halt;
       end;
      end;
      2. 使用定時器啟動探測
      在測試中,如果端口狀態正常,則net_stat=0;狀態異常則net_stat=1,并顯示“中斷”,系統響鈴報警。對節點表中所有節點進行測試的主要代碼如下:
      //取得欲測試端口的IP地址
      net_ip∶=Table1. FieldByName(‘對端IP’). asstring;
      //調用端口測試
      Test(Sender);
      if net_stat=0 then
       begin
        Table1. FieldByName(‘狀態’). asstring∶=‘中斷’;
      //端口異常,則net=1
      if net=0 then net∶=1;
       end
      else Table1. FieldByName(‘狀態’). asstring∶=‘正常’;
      //整表測試后,如有異常的端口,則10次響鈴報警
      if net=1 then FOR I∶=1 TO 10 DO PlaySound(‘RINGIN’, 0, SND_RESOURCE);
      3. 探測指定的端口:Test(Sender)
      const
      Size = 56;
      TimeOut = 3000;
      var
      Address: DWord;
      HostName, HostIP: String;
      Phe: PHostEnt;
      BufferSize, nPkts: Integer;
      pReqData, pData: Pointer;
      pIPE: PIcmpEchoReply;
      IPOpt: TIPOptionInformation;
      begin
      //將存儲字符串的地址轉化為標準的網絡IP地址
      Address ∶= inet_addr(PChar(net_ip));
      //取得測試端口的句柄
      Phe ∶= GetHostByAddr(@Address, 4, PF_INET);
      // 設定一個緩沖區,填充指定數據作為待發送的數據包
      BufferSize ∶= SizeOf(TICMPEchoReply) + Size;
      GetMem(pReqData, Size);
      GetMem(pData, Size);
      GetMem(pIPE, BufferSize);
      FillChar(pReqData^, Size, $AA);
      pIPE^.Data ∶= pData;
      FillChar(IPOpt, SizeOf(IPOpt), 0);
      IPOpt.TTL ∶= 64;
       //通過打開的句柄,發送ICMP數據包請求,在超時或接收應答報文后返回
      NPkts ∶= IcmpSendEcho(hICMP, Address, pReqData, Size, @IPOpt, pIPE, BufferSize, TimeOut);
      //根據是否從測試端口返回應答報文,判斷網絡狀態
       if NPkts = 0 then net_stat∶=0
      else begin
      HostIP ∶= StrPas(inet_ntoa(TInAddr(pIPE^.Address)));
      if trim(HostIP)=trim(net_ip) then net_stat∶=1
      else net_stat∶=0;
      end;
      //釋放變量
      FreeMem(pIPE);
      FreeMem(pData);
      FreeMem
      (pReqData);
      end;
      4. 關閉探測程序
      //釋放ICMP
      IcmpCloseHandle(hICMP);
      FreeLibrary(hICMPlib);
      //釋放WinSock
      if WSACleanup <> 0 then ShowMessage(‘Error freeing WinSock’);
      完善程序
      上述程序僅提供了基本的網絡探測方法,為了更好地體現網絡狀態和處理情況,可以對此程序進一步完善:
      1. 再建兩個表:
      ● 故障記錄和處理表: 在探測中將故障節點記錄保存,并記錄故障處理情況;
      ● 探測間隔表:靈活設置探測時間間隔。
      2. 添加節點庫維護模塊。
      3. 對于探測模塊的顯示進行改造,使故障節點呈現報警色(如紅色)。 


      日韩精品一区二区三区高清