知识大全 Delphi中用ICMP探测远程主机是否存活

Posted

篇首语:有志者事竟成,破釜沉舟,百二秦关终属楚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi中用ICMP探测远程主机是否存活相关的知识,希望对你有一定的参考价值。

Delphi中用ICMP探测远程主机是否存活  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

网络通讯中经常需要确定远程主机是否存活 以决定下一部进行的操作 可以直接使用ICMP协议来实现 但是要考虑许多协议细节 实现起来比较麻烦 Windows 自带的ICMP库里有现成的函数可以使用 只要在使用前填充相应的数据结构就可以了     以下是要使用的数据结构 这些结构MSDN里有C形式的声明 这里给出的是Delphi的形式     //用到的协议数据结构  PIPOptionInfo = ^TIPOptionInfo; // IP 头选项  TIPOptionInfo = packed record  TTL: Byte;//存活时间  TOS: Byte;//Type of Service 请求类型  Flags: Byte;//标志  OptionsSize: Byte;//选项长度  OptionsData: PChar;//选项数据  end;  PIcmpEchoReply = ^TIcmpEchoReply;  TIcmpEchoReply = packed record // 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探测数据报    //要用到的变量声明  hICMPDll hICMP:THandle;  wsaData:SADATA;  ICMPCreateFile:TICMPCreateFile;  IcmpCloseHandle:TIcmpCloseHandle;  IcmpSendEcho:TIcmpSendEcho;    //destip:要探测的远程地址 形如   procedure f_CheckOnline(destip:string);  var  IPOpt:TIPOptionInfo;// 发包的 IP 选项  IPAddr:DWORD;  pReqData pRevData:PChar;  pIPE:PIcmpEchoReply;// ICMP Echo 回复缓冲区  FSize: DWORD;  MyString:string;  FTimeOut:DWORD;  BufferSize:DWORD;  i:integer;  begin  hICMPdll := LoadLibrary( icmp dll ); //调取icmp 动态库  if hICMPDll<>NULL then  begin  WSAStartup($ wsaData);//初始化网络协议栈  @ICMPCreateFile := GetProcAddress(hICMPdll IcmpCreateFile ); //取动态库中的导出函数  @IcmpCloseHandle := GetProcAddress(hICMPdll IcmpCloseHandle );  @IcmpSendEcho := GetProcAddress(hICMPdll IcmpSendEcho );  hICMP := IcmpCreateFile; //创建 icmp句柄  IPAddr:= inet_addr(PChar(destip)); //取要探测的远端主机ip地址    FSize := ;  BufferSize := SizeOf(TICMPEchoReply) + FSize;  GetMem(pRevData FSize);  GetMem(pIPE BufferSize);  FillChar(pIPE^ SizeOf(pIPE^) );  pIPE^ Data := pRevData;  MyString := Hi OnLine? ;//任意字符串  pReqData := PChar(MyString);  FillChar(IPOpt Sizeof(IPOpt) );  IPOpt TTL := ;  FTimeOut := ;//等待时长  i:=IcmpSendEcho(hICMP IPAddr pReqData Length(MyString) @IPOpt pIPE BufferSize FTimeOut);//如果有返回 返回值表示收到的回复的个数 如果为 表示没有回复 主机无法到达  FreeMem(pRevData);  FreeMem(pIPE);  IcmpCloseHandle(hicmp);  FreeLibrary(hICMPdll);//释放动态库  WSAcleanup();//清理协议栈  end;  end; cha138/Article/program/Delphi/201311/24701

相关参考

知识大全 ssh(ssh-keygen)配置免输入密码登录远程主机的方法

  环境本地主机haeth://对外IP地址  远程主机haeth://对外IP地址  本地主机ha配置  复制代码代码如下:  [root@ha/]#cd/etc/ssh[root@hassh]#s

知识大全 Delphi中用Adsi创建IIS虚拟目录

Delphi中用Adsi创建IIS虚拟目录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 先引入类

知识大全 在Delphi中用拼音首字符序列来实现检索功能

在Delphi中用拼音首字符序列来实现检索功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在

知识大全 Delphi中用API实现在MSN的信息提示

Delphi中用API实现在MSN的信息提示  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我是

知识大全 Delphi实现远程串口的数据采集[1]

Delphi实现远程串口的数据采集[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Delphi实现远程串口的数据采集[2]

Delphi实现远程串口的数据采集[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  .使用M

知识大全 如何用Delphi6实现对计算机的远程控制

如何用Delphi6实现对计算机的远程控制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Win

远程抄表系统工作方式是什么?

  工作方式:该系统采用光电技术对电表、水表、煤气表的转盘信息进行采样,采集器记录数据,所记录的数据供抄表主机读取。在读取数据时,抄表主机根据实际管辖用户表的容量依次对所有用户表发出抄表指令,采集器接

远程抄表系统工作方式是什么?

  工作方式:该系统采用光电技术对电表、水表、煤气表的转盘信息进行采样,采集器记录数据,所记录的数据供抄表主机读取。在读取数据时,抄表主机根据实际管辖用户表的容量依次对所有用户表发出抄表指令,采集器接

知识大全 Java如何处理ICMP报文的收发

Java如何处理ICMP报文的收发  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前言  jav