background image

Delphi 中用 ICMP 探测远程主机是否存

网络通讯中经常需要确定远程主机是否存活,以决定下一部进行的操作。可以直接使用
ICMP 协议来实现,但是要考虑许多协议细节,实现起来比较麻烦。Windows 自带的 ICMP
库里有现成的函数可以使用,只要在使用前填充相应的数据结构就可以了。
以下是要使用的数据结构。这些结构

MSDN 里有 C 形式的声明,这里给出的是 Delphi 的形

式。
//用到的协议数据结构
PIPOptionInfo=^TIPOptionInfo;//IP 头选项
TIPOptionInfo=packedrecord
TTL:Byte;//存活时间
TOS:Byte;//TypeofService,请求类型
Flags:Byte;//标志
OptionsSize:Byte;//选项长度
OptionsData:PChar;//选项数据
end;
PIcmpEchoReply=^TIcmpEchoReply;
TIcmpEchoReply=packedrecord //ICMP 返回信息
Address:DWORD;//IP 地址
Status:DWORD;//状态
RTT:DWORD;
DataSize:Word;//数据长度
Reserved:Word;//保留
Data:Pointer;//数据
Options:TIPOptionInfo;//选项区
end;
//动态库中的函数声明
TIcmpCreateFile=function:THandle;stdcall;//创建 ICMP 句柄
TIcmpCloseHandle=function(IcmpHandle:THandle):Boolean;stdcall;//关闭 ICMP 句柄
TIcmpSendEcho=function(IcmpHandle:THandle;DestinationAddress:DWORD;
RequestData:Pointer;RequestSize:Word;RequestOptions:PIPOptionInfo;
ReplyBuffer:Pointer;ReplySize:DWord;Timeout:DWord):DWord;stdcall;// 发 送 ICMP 探 测 数 据

//要用到的变量声明