首页 / 软件开发 / Delphi / 用Delphi实现专线状态的探测
用Delphi实现专线状态的探测2010-11-23 范智鑫 王毅燕 随着计算机用户的增多,计算机网络越来越复杂,如何进行实时的网络检测 成为网管人员关心的问题。实时监测可以在最早的时间内发现问题,避免网络长 时间继线。本文介绍一种利用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;