Delphi中用ICMP探测远程主机状态

Delphi中用ICMP探测远程主机状态,第1张

Delphi中用ICMP探测远程主机状态,第2张

在网络通信中,经常需要确定远程主机是否活着,以此来决定下一步做什么。可以直接用ICMP协议实现,但是需要考虑很多协议细节,实现起来比较麻烦。Windows自带的ICMP库中有现成的函数。使用前只需填写相应的数据结构即可。

下面是要使用的数据结构。在这些结构MSDN中有C-form声明,这里给出了Delphi形式。

//使用的协议数据结构
pippoptioninfo = tipoptioninfo;//IP header option
tipoptioninfo = packed record
TTL:byte;//生存时间
TOS:Byte;//服务类型,请求类型
Flags:Byte;//flag
options size:Byte;//选项长度
options data:PChar;//选项数据
end;
picmpechoreply = ^ticmpechoreply;
ticmpechoreply = packed record//icmp返回信息
地址:DWORD//IP地址
状态:DWORD//状态
RTT:DWORD;
DataSize:Word;//数据长度
保留:Word//Keep
Data:Pointer;//data
Options:TIPOptionInfo;//选项区
end;

//动态库中的函数声明
ticmpcreatefile = function:thank;stdcall//创建一个ICMP句柄
TicmpCloseHandle = function(ICMP handle:thank):boolean;stdcall//关闭ICMP handle
ticmpsendeecho = function(ICMP handle:thank;destination address:DWORD;
request data:Pointer;request size:Word;request options:pip option info;
reply buffer:Pointer;回复:DWord;暂停:DWord):DWord;stdcall//发送ICMP探测数据报

//声明要使用的变量
hicmp dll,hi CMP:thank;
wsa data:tws adata;
icmp create file:TICMPCreateFile;
IcmpCloseHandle:TIcmpCloseHandle;
IcmpSendEcho:TIcmpSendEcho;

//destination:要检测的远程地址,形式为192 . 168 . 1 . 1
procedure f _ check online(destination:string);
var
IPOpt:TIPOptionInfo;//数据包的IP选项
IP addr:DWORD;
pReqData,prev data:PChar;
管道:PIcmpEchoReply// ICMP回应回复缓冲区
FSize:DWORD;
MyString:string;
FTimeOut:DWORD;
buffer size:DWORD;
i:整数;
begin
hicmp dll:= LoadLibrary(' icmp . dll ');//调用icmp动态库
如果hicmpdll为null那么
begin
wsa startup($ 101,wsa data);//初始化网络协议栈
@ icmp create file:= getprocaddress(hicmp dll,' icmp create file ');//取动态库中的导出函数
@ ICMP close handle:= GetProcAddress(Hicmp DLL,' ICMP close handle ');
@ IcmpSendEcho:= GetProcAddress(hicmp dll,' IcmpSendEcho ');
hICMP:= IcmpCreateFile;//创建一个icmp句柄
IP addr:= inet _ addr(pchar(destination));//获取要探测的远程主机的ip地址

FSize:= 40;
buffer size:= SizeOf(TICMPEchoReply)+FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,buffer size);
FillChar(pIPE^,SizeOf(pIPE^),0);
pIPE^.data:= prev data;
MyString := '嗨,在线吗?';//any string
pReqData:= PChar(MyString);
FillChar(IPOpt,Sizeof(IPOpt),0);
IPOpt。TTL:= 64;
FTimeOut:= 500;//等待时间
I: = icmpsendecho (hicmp,ipaddr,preqdata,length (mystring),@ ipopt,pipe,buffersize,ftimeout);//如果有返回,返回值表示收到的回复数。如果0表示不回复,主机无法到达
free mem(prev data);
FreeMem(管道);
IcmpCloseHandle(hicmp);
free library(hICMPdll);//释放动态库
WSAcleanup();//清理协议栈
end;
end;

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Delphi中用ICMP探测远程主机状态

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情