程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi實現專線狀態的探測

用Delphi實現專線狀態的探測

編輯:Delphi

隨著計算機用戶的增多,計算機網絡越來越復雜,如何進行實時的網絡檢測 成為網管人員關心的問題。實時監測可以在最早的時間內發現問題,避免網絡長 時間繼線。本文介紹一種利用Delphi編寫應用程序實現專線狀態探測的方法。

實現原理

許多人經常利用Windows中的兩條DOS命令(Ping和Tracert)來測試網絡狀態 ,其原理是通過向探測的節點端口發送數據包請求,然後從該端口是否應答來判 斷網絡是否暢通。其實,在Windows的System目錄下有一個Icmp.dll文件,該動 態鏈接庫提供了ICMP協議的所有功能,通過對該動態鏈接庫的調用可以完成發送 請求和接收應答。因此,可以利用該動態鏈接庫實現專線狀態的探測。

Icmp.dll文件內的主要調用函數如下:

● IcmpCreateFile: 打開一個句柄,通過該句柄發送ICMP的請求報文;

● IcmpCloseHandle: 關閉通過IcmpCreateFile函數打開的句柄;

● IcmpSendEcho:通過打開的句柄發送ICMP請求,在超時或接收到應答報文 後返回。

編程實現

首先構造節點庫(如圖1所示),然後通過調用ICMP協議,向測試端口發送請 求,如果接收到該端口的應答,則狀態為“正常”,否則,狀態為“中斷”。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved