• Delphi通过ICMP检测与远程主机连接


    { ping IP 地址(返回false or true) 2015-03-23}
    function PingHost(HostIP: String): Boolean;
    type
      PIPOptionInformation =  ^TIPOptionInformation;
      TIPOptionInformation = packed record
        TTL:Byte;
        TOS:Byte;
        Flags:Byte;
        OptionsSize:Byte;
        OptionsData:PChar;
      end;
    
      PIcmpEchoReply= ^TIcmpEchoReply;
      TIcmpEchoReply = packed record
        Address: DWORD;
        Status:DWORD;
        RTT:DWORD;
        DataSize:Word;
        Reserved:Word;
        Data:Pointer;
        Options:TIPOptionInformation;
      end;
      TIcmpCreateFile = function:THandle;stdcall;
      TIcmpCloseHandle= function(IcmpHandle:THandle):Boolean;stdcall;
      TIcmpSendEcho=function(IcmpHandle:THandle;
                      DestinationAddress: DWORD;
                      RequestData:   Pointer;
                      RequestSize:   Word;
                      RequestOptions:   PIPOptionInformation;
                      ReplyBuffer:   Pointer;
                      ReplySize:   DWord;
                      Timeout:   DWord
                      ):DWord;stdcall;
    var
      hICMP:THandle;
      hICMPdll:THandle;
      IcmpCreateFile:TIcmpCreateFile;
      IcmpCloseHandle:TIcmpCloseHandle;
      IcmpSendEcho:TIcmpSendEcho;
      pIPE:PIcmpEchoReply;//   ICMP   Echo   reply   buffer
      FIPAddress:DWORD;
      FSize:DWORD;
      FTimeOut:DWORD;
      BufferSize:DWORD;
      pReqData,pRevData:PChar;
      MyString:string;
    begin   
      Result:=False;
      hICMPdll:=LoadLibrary('icmp.dll');
      if hICMPdll=0 then   exit;
    
      @ICMPCreateFile:=GetProcAddress(hICMPdll,'IcmpCreateFile');
      @IcmpCloseHandle:=GetProcAddress(hICMPdll,'IcmpCloseHandle');
      @IcmpSendEcho:=GetProcAddress(hICMPdll, 'IcmpSendEcho');
      hICMP   :=   IcmpCreateFile;
      if (hICMP=INVALID_HANDLE_VALUE) then  exit;
      FIPAddress:=inet_addr(PChar(HostIP));
      MyString := 'Hello,World';                                 //send   data   buffer
      pReqData:=PChar(MyString);
    
      FSize:=40;                                                 //receive   data   buffer
      BufferSize:=SizeOf(TICMPEchoReply)+FSize;
      GetMem(pIPE,BufferSize);   
      FillChar(pIPE^,SizeOf(pIPE^), 0);
      GetMem(pRevData,FSize);
      pIPE^.Data:=pRevData;
      FTimeOut:=500;
      try
        Result:=IcmpSendEcho(hICMP, FIPAddress,pReqData,
        Length(MyString),nil,pIPE,BufferSize,FTimeOut)>0;
      finally
        IcmpCloseHandle(hICMP);
        FreeLibrary(hICMPdll);
        FreeMem(pRevData);
        FreeMem(pIPE);
      end;
    end;
  • 相关阅读:
    Unity3D使用OpenFileDialog后崩溃
    JS定时器
    如果把我剥得一文不名丢在沙漠的中央,只要一行驼队经过———我就可以重建整个商业帝国
    软件开发架构
    C#对象序列化与反序列化
    我的作品们
    fread 不能读取最后一个数据块
    for循环中的i++和++i
    MOS管不能关断的原因!!!
    AD16 快速原理图封装导出
  • 原文地址:https://www.cnblogs.com/tc310/p/4359887.html
Copyright © 2020-2023  润新知