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

操比吃炫迈

操比吃炫迈

2016-02-19 19:33

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

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

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

  2005-03-10 jlbnet

  网络通讯中经常需要确定远程主机是否存活,以决定下一部进行的操作。可以直接使用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:TWSADATA;
    ICMPCreateFile:TICMPCreateFile;
    IcmpCloseHandle:TIcmpCloseHandle;
    IcmpSendEcho:TIcmpSendEcho;

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

  //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实现远程串口的数据采集

Visual C#中用WMI控制远程计算机

编程语言 网络编程
Visual C#中用WMI控制远程计算机

lolAD刺客新符文搭配推荐

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

巧用excel2007/2003进行拍照

巧用excel2007/2003进行拍照

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

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