• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        用Delphi完成專線狀態的探測

        用Delphi完成專線狀態的探測

        更新時間:2020-01-14 文章作者:未知 信息來源:網絡 閱讀次數:

        范智鑫 王毅燕

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

        圖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. 對于探測模塊的顯示進行改造,使故障節點呈現報警色(如紅色)。 

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲伊人久久大香线蕉在观| 久久精品国产99精品国产亚洲性色| 亚洲国产日韩在线成人蜜芽 | 国产亚洲美日韩AV中文字幕无码成人| 亚洲一级特黄特黄的大片| 国产一卡二卡3卡四卡免费| 亚洲欧洲春色校园另类小说| 午夜免费福利视频| 久久久久久亚洲精品成人| 最近免费中文字幕mv电影 | 亚洲最大黄色网址| 国产在线观看麻豆91精品免费| 91在线精品亚洲一区二区| 日韩在线播放全免费| 亚洲国产片在线观看| 全免费a级毛片免费看无码| 亚洲AV无码资源在线观看| 四虎亚洲国产成人久久精品| 一二三区免费视频| 久久亚洲精品AB无码播放| 57pao一国产成视频永久免费| 亚洲成人免费电影| 暖暖免费高清日本一区二区三区 | 久久影院亚洲一区| 日本免费人成网ww555在线| 亚洲精品永久www忘忧草| 美女被免费视频网站a国产| 黄色免费在线网址| 亚洲动漫精品无码av天堂| 最近免费中文在线视频| 亚洲国产高清国产拍精品| 国产成人亚洲精品影院| 97av免费视频| 亚洲av日韩专区在线观看| 337p日本欧洲亚洲大胆裸体艺术 | 亚洲精品电影天堂网| 日韩免费福利视频| 久久免费国产精品一区二区| 亚洲国产精品综合久久久| 亚洲国产综合无码一区二区二三区| 国产一精品一AV一免费|