用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;