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

2016-02-19 19:33 9 1 收藏

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

【 tulaoshi.com - 编程语言 】

 

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

  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;

(本文来源于图老师网站,更多请访问https://www.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;
  

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

来源:https://www.tulaoshi.com/n/20160219/1621307.html

延伸阅读
标签: ASP
          这几天做ASP.Net追捕,也算是我入门吧。思路很简单,主要就是识别远程主机传回的Banner, 判断远程主机服务器。这可能不够准确,因为合格的管理员可能会去修改Banner。 代码如下(从我的Web追捕里找出来的,用VB.Net)          &...
标签: 精子存活时间
精子存活时间 精子存活时间:精子在女性体内存活时间为23天 我们知道,卵子存活的时间一般是24小时,也就是1天左右。但是精子在女性体内存活的时间比卵子还要长,一般能够达到2-3天,个别情况可能更长。研究表明,人类精子在体外自然环境中只能存活几分钟。 而直接进入女性体内的精子由于环境相对适宜,依然能够保持旺盛的生命力...
卵子存活时间 对女性来说,怀孕的可能性起始于两个卵巢,那是两个附着在子宫两侧的小小的椭圆形器官,其中充满了卵子。 卵子存活时间为12天,而其受精能力最强的时间在排卵后24小时内,精子进入女性生殖道可存活2~3天,所以在排卵期进行性生活是最容易受孕的,而距离排卵期越远受孕机会越少。在排卵期前5天和后4天,共计大约10天左右...
标签: 光荣使命 手游
光荣使命单排怎么提高存活率 在单人模式中,玩家一旦倒地就是马上被淘汰的,所以想要在游戏中存活更久,我们就要更加小心,在游戏中,消耗道具是非常重要的,要是没有补血道具,是很容易就被淘汰的。 我们在遭遇敌人、车撞到障碍物上或者从高处落下时都会损失血量,所以在单人演习中,我们需要充足的医疗用品作为补给,才能在遭遇这些不确定...
ICMP简介: 对于熟悉网络的人来说, ICMP是再熟悉不过了. 它同IP协议一样工作在ISO模型的网络层, 它的全称是: Internet Control Message Protocal. 其在网络中的主要作用是: - 主机探测 - 路由维护 - 路由选择 - 流量控制 对于主机探测来说有很多方法,主机某些服务的BANNER,一些使用的应用程序,或者使用工...

经验教程

230

收藏

73
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部