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

操比吃炫迈

操比吃炫迈

2016-02-19 19:33

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享Delphi中用ICMP探测远程主机是否存活的教程,热爱PS的朋友们快点看过来吧!
 

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

  2005-03-10 jlbnet

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

  以下是要使用的数据结构。这些结构MSDN里有C形式的声明,这里给出的是Delphi的形式。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  //用到的协议数据结构
    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探测数据报

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  //要用到的变量声明
    hICMPDll,hICMP:THandle;
    wsaData:TWSADATA;
    ICMPCreateFile:TICMPCreateFile;
    IcmpCloseHandle:TIcmpCloseHandle;
    IcmpSendEcho:TIcmpSendEcho;

  //destip:要探测的远程地址,形如 192.168.1.1
  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 hICMPDllNULL then
    begin
      WSAStartup($101,wsaData);//初始化网络协议栈
      @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile'); //取动态库中的导出函数
      @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
      @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
      hICMP := IcmpCreateFile; //创建 icmp句柄
   IPAddr:= inet_addr(PChar(destip)); //取要探测的远端主机ip地址
     
     FSize := 40;
     BufferSize := SizeOf(TICMPEchoReply) + FSize;
     GetMem(pRevData,FSize);
     GetMem(pIPE,BufferSize);
     FillChar(pIPE^, SizeOf(pIPE^), 0);
     pIPE^.Data := pRevData;
     MyString := 'Hi, OnLine?';//任意字符串
     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表示没有回复,主机无法到达
     FreeMem(pRevData);
     FreeMem(pIPE);
      IcmpCloseHandle(hicmp);
      FreeLibrary(hICMPdll);//释放动态库
      WSAcleanup();//清理协议栈
    end;
  end;
  

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
Delphi中用ICMP探测远程主机是否存活

Delphi中用FastReport制作报表

编程语言 网络编程
Delphi中用FastReport制作报表

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

远程得到任意远程NT主机帐号List的源代码

编程语言 网络编程
远程得到任意远程NT主机帐号List的源代码

用Delphi实现远程屏幕抓取

Delphi
用Delphi实现远程屏幕抓取

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Delphi实现远程串口的数据采集

Delphi
Delphi实现远程串口的数据采集

在Delphi中利用CreateRemoteThread远程注入例子

编程语言 网络编程
在Delphi中利用CreateRemoteThread远程注入例子

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

巧用excel2007/2003进行拍照

巧用excel2007/2003进行拍照

Google改进SSL机制控制SSL安全机制存漏洞

Google改进SSL机制控制SSL安全机制存漏洞
下拉加载更多内容 ↓