zoukankan      html  css  js  c++  java
  • Delphi 快速Ping局域网IP或网站并返回结果的方式

    Delphi 快速Ping局域网IP并返回结果的方式

    引入单元:WinSock;

    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;
      //uses winsock;
      FIPAddress := inet_addr(pchar(HostIP)); //Delphi xe:  inet_addr(PANSIChar(ansistring(HostIP)));
      MyString := 'Hello TaoRoy'; //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 := 50; //超时间隔毫秒
      try
        result := IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), nil, pIPE, BufferSize, FTimeOut) > 0;
      finally
        IcmpCloseHandle(hICMP);
        FreeLibrary(hICMPdll);
        FreeMem(pRevData);
        FreeMem(pIPE);
      end;
    end;

    示例:

    var
      b:boolean;
    begin    
      b:=PingHost('192.168.0.2');
      if b then  ShowMessage('已连接') else ShowMessage('未连接') ;
    
      b:=PingHost('www.baidu.com');
      if  then  ShowMessage('True') else ShowMessage('False') ;
    end;
    

    创建时间:2021.05.11  更新时间:

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    SQL Server IF Exists 判断数据库对象是否存在的用法
    C# RDLC报表不出现预览窗体直接输出到打印机
    C# 未安装Office环境下使用NPOI导出Excel文件
    C# 键盘中的按键对应KeyValue
    微信小程序下可以使用的MD5以及AES加密(通用)
    SQL Server 根据树状结构表生成以/号分割的路由字符串
    C# Winform下一个热插拔的MIS/MRP/ERP框架16(窗体基类场景2)
    WEB H5 JS QRCode二维码快速自动生成
    C# Winform 小技巧(Datagridview某一列按状态显示不同图片)
    获取请求地址的IP地址
  • 原文地址:https://www.cnblogs.com/guorongtao/p/14756326.html
Copyright © 2011-2022 走看看