许胖胖 發表於 2019-9-25 10:58:00

Delphi 实现Ping命令

<p>Delphi&nbsp; 实现Ping命令</p>
<div class="cnblogs_code"><img id="code_img_closed_f2181539-440c-403f-95e1-5129c437a0dd" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_f2181539-440c-403f-95e1-5129c437a0dd" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_f2181539-440c-403f-95e1-5129c437a0dd" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">unit FtPing;

interface


uses
    Windows, SysUtils, Classes, Controls, Winsock, StdCtrls;

resourcestring
    SICMPRunError </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ICMP Run Error</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    SInitFailed </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Init Failed. Maybe Winsock Verison Error</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    SNoResponse </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">[%0:S] No Response</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    SInvalidAddr </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IP Address Error</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    SPingResultString </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">[%0:S]: Bytes:%1:D Time: %2:DmsTTL:%3:D</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">

    PCnIPOptionInformation </span>=<span style="color: rgba(0, 0, 0, 1)"> ^TCnIPOptionInformation;
    TCnIPOptionInformation </span>= <span style="color: rgba(0, 0, 255, 1)">packed</span> <span style="color: rgba(0, 0, 255, 1)">record</span><span style="color: rgba(0, 0, 0, 1)">
      TTL: Byte; </span>// Time To Live (used <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> traceroute)
      TOS: Byte; </span>// Type Of Service (usually <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
      Flags: Byte; </span>// IP header flags (usually <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
      OptionsSize: Byte; </span>// Size <span style="color: rgba(0, 0, 255, 1)">of</span> options data (usually <span style="color: rgba(128, 0, 128, 1)">0</span>, max <span style="color: rgba(128, 0, 128, 1)">40</span><span style="color: rgba(0, 0, 0, 1)">)
      OptionsData: PAnsiChar; </span>//<span style="color: rgba(0, 0, 0, 1)"> Options data buffer
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    PCnIcmpEchoReply </span>=<span style="color: rgba(0, 0, 0, 1)"> ^TCnIcmpEchoReply;
    TCnIcmpEchoReply </span>= <span style="color: rgba(0, 0, 255, 1)">packed</span> <span style="color: rgba(0, 0, 255, 1)">record</span><span style="color: rgba(0, 0, 0, 1)">
      Address: DWORD; </span>//<span style="color: rgba(0, 0, 0, 1)"> replying address
      Status: DWORD; </span>//<span style="color: rgba(0, 0, 0, 1)"> IP status value (see below)
      RTT: DWORD; </span>// Round Trip Time <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> milliseconds
      DataSize: Word; </span>//<span style="color: rgba(0, 0, 0, 1)"> reply data size
      Reserved: Word;
      Data: Pointer; </span>// pointer <span style="color: rgba(0, 0, 255, 1)">to</span><span style="color: rgba(0, 0, 0, 1)"> reply data buffer
      Options: TCnIPOptionInformation; </span>//<span style="color: rgba(0, 0, 0, 1)"> reply options
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    TIpInfo </span>= <span style="color: rgba(0, 0, 255, 1)">record</span><span style="color: rgba(0, 0, 0, 1)">
      Address: Int64;
      IP: string;
      Host: string;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    TOnReceive </span>= <span style="color: rgba(0, 0, 255, 1)">procedure</span>( Sender: TComponent; IPAddr, HostName: string; TTL, TOS: Byte ) <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> object;

    TOnError </span>= <span style="color: rgba(0, 0, 255, 1)">procedure</span>( Sender: TComponent; IPAddr, HostName: string; TTL, TOS: Byte; ErrorMsg: string ) <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> object;

    </span>//==============================================================================
    //<span style="color: rgba(0, 0, 0, 1)"> Ping 通讯类
    </span>//==============================================================================

      <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TFtPing </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">

    TFtPing </span>=<span style="color: rgba(0, 0, 0, 1)"> class( TComponent )
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 通过调用ICMP.DLL库中的函数来实现Ping功能。</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    private
      hICMP: THANDLE;
      FRemoteHost: string;
      FRemoteIP: string;
      FIPAddress: Int64;
      FTTL: Byte;
      FTimeOut: DWord;
      FPingCount: Integer;
      FDelay: Integer;
      FOnError: TOnError;
      FOnReceived: TOnReceive;
      FDataString: string;
      FWSAData: TWSAData;
      FIP: TIpInfo;

      </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetPingCount( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: Integer );
      </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetRemoteHost( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: string );
      </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetTimeOut( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: DWord );
      </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetTTL( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: Byte );
      </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetDataString( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: string );
      </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> SetRemoteIP( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: string );
      </span><span style="color: rgba(0, 0, 255, 1)">function</span> PingIP_Host( <span style="color: rgba(0, 0, 255, 1)">const</span> aIP: TIpInfo; <span style="color: rgba(0, 0, 255, 1)">const</span> Data; Count: Cardinal; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Integer;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 以设定的数据Data(无类型缓冲区)Ping一次并返回结果。Count表示数据长度 </span><span style="color: rgba(0, 128, 0, 1)">}</span>
      <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetReplyString( aResult: Integer; aIP: TIpInfo; pIPE: PCnIcmpEchoReply ): string;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 返回结果字符串。</span><span style="color: rgba(0, 128, 0, 1)">}</span>
      <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> GetDataString: string;
      </span><span style="color: rgba(0, 0, 255, 1)">function</span> GetIPByName( <span style="color: rgba(0, 0, 255, 1)">const</span> aName: string; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aIP: string ): Boolean;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 通过机器名称获取IP地址</span><span style="color: rgba(0, 128, 0, 1)">}</span>
      <span style="color: rgba(0, 0, 255, 1)">function</span> SetIP( aIPAddr, aHost: string; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aIP: TIpInfo ): Boolean;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 通过机器名称或IP地址填充完整IP信息</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    protected

    public
      constructor Create( AOwner: TComponent ); override;
      destructor Destroy; override;

      </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> IsOnline: Boolean;

      </span><span style="color: rgba(0, 0, 255, 1)">function</span> Ping( <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 进行循环Ping,循环次数在PingCount属性中指定。</span><span style="color: rgba(0, 128, 0, 1)">}</span>
      <span style="color: rgba(0, 0, 255, 1)">function</span> PingOnce( <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean; overload;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 以设定的数据Ping一次并返回结果。</span><span style="color: rgba(0, 128, 0, 1)">}</span>
      <span style="color: rgba(0, 0, 255, 1)">function</span> PingOnce( <span style="color: rgba(0, 0, 255, 1)">const</span> aIP: string; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean; overload;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 向指定IP进行一次Ping并返回结果。</span><span style="color: rgba(0, 128, 0, 1)">}</span>
      <span style="color: rgba(0, 0, 255, 1)">function</span> PingFromBuffer( <span style="color: rgba(0, 0, 255, 1)">var</span> Buffer; Count: Longint; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 以参数Buffer的数据Ping一次并读取返回结果。</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
    published
      property RemoteIP: string read FRemoteIP write SetRemoteIP;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 要Ping的目标主机地址,只支持ip</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property RemoteHost: string read FRemoteHost write SetRemoteHost;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 要ping的目标主机名,有主机名存在时会覆盖 RemoteIP 的内容</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property PingCount: Integer read FPingCount write SetPingCount default </span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 调用Ping方法时进行多少次数据发送,默认是4次。</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property Delay: Integer read FDelay write FDelay default </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 相邻两次 Ping 间的时间间隔,单位毫秒,默认 0 也就是不延时</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property TTL: Byte read FTTL write SetTTL;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 设置的TTL值,Time to Live</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property TimeOut: DWord read FTimeOut write SetTimeOut;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 设置的超时值</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property DataString: string read GetDataString write SetDataString;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* 欲发送的数据,以字符串形式表示,默认为"CnPack Ping"。</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property OnReceived: TOnReceive read FOnReceived write FOnReceived;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* Ping一次成功时返回数据所触发的事件</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
      property OnError: TOnError read FOnError write FOnError;
      </span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">* Ping出错时返回的内容和信息。包括目的未知、不可达、超时等。</span><span style="color: rgba(0, 128, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

implementation

</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$R-</span><span style="color: rgba(0, 128, 0, 1)">}</span>

<span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)">
    SCnPingData </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">FtPack Ping.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    ICMPDLL </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">icmp.dll</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">type</span>

    //==============================================================================
    //<span style="color: rgba(0, 0, 0, 1)"> 辅助过程从icmp.dll导入的函数
    </span>//==============================================================================<span style="color: rgba(0, 0, 0, 1)">

    TIcmpCreateFile </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">( ): THandle; stdcall;

    TIcmpCloseHandle </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">( IcmpHandle: THandle ): Boolean; stdcall;

    TIcmpSendEcho </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">( IcmpHandle: THandle;
      DestAddress: DWORD;
      RequestData: Pointer;
      RequestSize: Word;
      RequestOptions: PCnIPOptionInformation;
      ReplyBuffer: Pointer;
      ReplySize: DWord;
      TimeOut: DWord ): DWord; stdcall;

</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    IcmpCreateFile: TIcmpCreateFile </span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
    IcmpCloseHandle: TIcmpCloseHandle </span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
    IcmpSendEcho: TIcmpSendEcho </span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;

    IcmpDllHandle: THandle </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> InitIcmpFunctions;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    IcmpDllHandle :</span>=<span style="color: rgba(0, 0, 0, 1)"> LoadLibrary( ICMPDLL );
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> IcmpDllHandle &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            @IcmpCreateFile :</span>= GetProcAddress( IcmpDllHandle, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IcmpCreateFile</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> );
            @IcmpCloseHandle :</span>= GetProcAddress( IcmpDllHandle, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IcmpCloseHandle</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> );
            @IcmpSendEcho :</span>= GetProcAddress( IcmpDllHandle, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">IcmpSendEcho</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> );
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> FreeIcmpFunctions;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> IcmpDllHandle &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      FreeLibrary( IcmpDllHandle );
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span>//==============================================================================
//<span style="color: rgba(0, 0, 0, 1)"> Ping 通讯类
</span>//==============================================================================

<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> TFtPing </span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">

constructor TFtPing.Create( AOwner: TComponent );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    inherited Create( AOwner );
    FRemoteIP :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
    FTTL :</span>= <span style="color: rgba(128, 0, 128, 1)">64</span><span style="color: rgba(0, 0, 0, 1)">;
    FPingCount :</span>= <span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">;
    FDelay :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    FTimeOut :</span>= <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
    FDataString :</span>=<span style="color: rgba(0, 0, 0, 1)"> SCnPingData;

    hICMP :</span>= IcmpCreateFile( ); //<span style="color: rgba(0, 0, 0, 1)"> 取得DLL句柄
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> hICMP = INVALID_HANDLE_VALUE <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            raise Exception.Create( SICMPRunError );
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



destructor TFtPing.Destroy;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> hICMP &lt;&gt; INVALID_HANDLE_VALUE <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            IcmpCloseHandle( hICMP );
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    inherited Destroy;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TFtPing.SetPingCount( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: Integer );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> Value &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      FPingCount :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TFtPing.SetRemoteIP( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: string );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> FRemoteIP &lt;&gt; Value <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            FRemoteIP :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> SetIP( FRemoteIP, <span style="color: rgba(128, 0, 0, 1)">''</span>, FIP ) <span style="color: rgba(0, 0, 255, 1)">then</span>
                <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                  FRemoteHost :</span>=<span style="color: rgba(0, 0, 0, 1)"> FIP.Host;
                  FIPAddress :</span>=<span style="color: rgba(0, 0, 0, 1)"> FIP.Address;
                </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TFtPing.SetRemoteHost( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: string );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> FRemoteHost &lt;&gt; Value <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
            //<span style="color: rgba(0, 0, 0, 1)"> RemoteHost 更改的话,RemoteIP 自动清空
            FRemoteHost :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> SetIP( <span style="color: rgba(128, 0, 0, 1)">''</span>, FRemoteHost, FIP ) <span style="color: rgba(0, 0, 255, 1)">then</span>
                <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                  FRemoteIP :</span>=<span style="color: rgba(0, 0, 0, 1)"> FIP.IP;
                  FIPAddress :</span>=<span style="color: rgba(0, 0, 0, 1)"> FIP.Address;
                </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TFtPing.SetTimeOut( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: DWord );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FTimeOut :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TFtPing.SetTTL( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: Byte );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FTTL :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TFtPing.SetDataString( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> Value: string );
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    FDataString :</span>=<span style="color: rgba(0, 0, 0, 1)"> Value;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TFtPing.GetDataString: string;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> FDataString = <span style="color: rgba(128, 0, 0, 1)">''</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      FDataString :</span>=<span style="color: rgba(0, 0, 0, 1)"> SCnPingData;
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> FDataString;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TFtPing.IsOnline: Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    sReply: string;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetIP( RemoteIP, RemoteHost, FIP );
    Result :</span>= PingIP_Host( FIP, pointer( FDataString )^, Length( DataString ), sReply ) &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.Ping( <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    iCount, iResult: Integer;
    sReply: string;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    aReply :</span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
    iResult :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    try
      SetIP( RemoteIP, RemoteHost, FIP );
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> iCount := <span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">to</span> PingCount <span style="color: rgba(0, 0, 255, 1)">do</span>
            <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                iResult :</span>= PingIP_Host( FIP, Pointer( FDataString )^, Length( DataString ) *<span style="color: rgba(0, 0, 0, 1)"> SizeOf( Char ), sReply );
                aReply :</span>= aReply + #<span style="color: rgba(128, 0, 128, 1)">13</span>#<span style="color: rgba(128, 0, 128, 1)">10</span> +<span style="color: rgba(0, 0, 0, 1)"> sReply;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> iResult &lt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                  Break;

                </span><span style="color: rgba(0, 0, 255, 1)">if</span> FDelay &gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                  Sleep( FDelay );
            </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    finally
      Result :</span>= iResult &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.PingOnce( <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetIP( RemoteIP, RemoteHost, FIP );
    Result :</span>= PingIP_Host( FIP, pointer( FDataString )^, Length( DataString ), aReply ) &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.PingOnce( <span style="color: rgba(0, 0, 255, 1)">const</span> aIP: string; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetIP( aIP, aIP, FIP );
    Result :</span>= PingIP_Host( FIP, pointer( FDataString )^, Length( DataString ), aReply ) &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.PingFromBuffer( <span style="color: rgba(0, 0, 255, 1)">var</span> Buffer; Count: Integer; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetIP( RemoteIP, RemoteHost, FIP );
    Result :</span>= PingIP_Host( FIP, Buffer, Count, aReply ) &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.PingIP_Host( <span style="color: rgba(0, 0, 255, 1)">const</span> aIP: TIpInfo; <span style="color: rgba(0, 0, 255, 1)">const</span> Data; Count: Cardinal; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aReply: string ): Integer;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    IPOpt: TCnIPOptionInformation; </span>//<span style="color: rgba(0, 0, 0, 1)"> 发送数据结构
    pReqData, pRevData: PAnsiChar;
    pCIER: PCnIcmpEchoReply;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>= -<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">;
    pReqData :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">if</span> Count &lt;= <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            aReply :</span>= GetReplyString( Result, aIP, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)"> );
            Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> aIP.Address = INADDR_NONE <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
            Result :</span>= -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
            aReply :</span>= GetReplyString( Result, aIP, <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)"> );
            Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    GetMem( pCIER, SizeOf( TCnICMPEchoReply ) </span>+<span style="color: rgba(0, 0, 0, 1)"> Count );
    GetMem( pRevData, Count );
    try
      FillChar( pCIER^, SizeOf( TCnICMPEchoReply ) </span>+ Count, <span style="color: rgba(128, 0, 128, 1)">0</span> ); //<span style="color: rgba(0, 0, 0, 1)"> 初始化接收数据结构
      pCIER^.Data :</span>=<span style="color: rgba(0, 0, 0, 1)"> pRevData;
      GetMem( pReqData, Count );
      Move( Data, pReqData^, Count ); </span>//<span style="color: rgba(0, 0, 0, 1)"> 准备发送的数据
      FillChar( IPOpt, Sizeof( IPOpt ), </span><span style="color: rgba(128, 0, 128, 1)">0</span> ); //<span style="color: rgba(0, 0, 0, 1)"> 初始化发送数据结构
      IPOpt.TTL :</span>=<span style="color: rgba(0, 0, 0, 1)"> FTTL;

      try </span>//<span style="color: rgba(0, 0, 0, 1)">Ping开始
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> WSAStartup( MAKEWORD( <span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">0</span> ), FWSAData ) &lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                raise Exception.Create( SInitFailed );
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> IcmpSendEcho( hICMP, //<span style="color: rgba(0, 0, 0, 1)">dll handle
                aIP.Address, </span>//<span style="color: rgba(0, 0, 0, 1)">target
                pReqData, </span>//<span style="color: rgba(0, 0, 0, 1)">data
                Count, </span>//<span style="color: rgba(0, 0, 0, 1)">data length
                @IPOpt, </span>//addree <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> ping option
                pCIER,
                SizeOf( TCnICMPEchoReply ) </span>+ Count, //<span style="color: rgba(0, 0, 0, 1)">pack size
                FTimeOut </span>//<span style="color: rgba(0, 0, 0, 1)">timeout value
                ) </span>&lt;&gt; <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
                <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                  Result :</span>= <span style="color: rgba(128, 0, 128, 1)">0</span>; //<span style="color: rgba(0, 0, 0, 1)"> Ping正常返回
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> Assigned( FOnReceived ) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                        FOnReceived( Self, aIP.IP, aIP.Host, IPOpt.TTL, IPOpt.TOS );
                </span><span style="color: rgba(0, 0, 255, 1)">end</span>
            <span style="color: rgba(0, 0, 255, 1)">else</span>
                <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                  Result :</span>= -<span style="color: rgba(128, 0, 128, 1)">2</span>; //<span style="color: rgba(0, 0, 0, 1)"> 没有响应
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> Assigned( FOnError ) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                        FOnError( Self, aIP.IP, aIP.Host, IPOpt.TTL, IPOpt.TOS, SNoResponse );
                </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      except
            on E: Exception </span><span style="color: rgba(0, 0, 255, 1)">do</span>
                <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                  Result :</span>= -<span style="color: rgba(128, 0, 128, 1)">3</span>; //<span style="color: rgba(0, 0, 0, 1)"> 发生错误
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> Assigned( FOnError ) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                        FOnError( Self, aIP.IP, aIP.Host, IPOpt.TTL, IPOpt.TOS, E.Message );
                </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    finally
      WSACleanUP;
      aReply :</span>=<span style="color: rgba(0, 0, 0, 1)"> GetReplyString( Result, aIP, pCIER );
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> pRevData &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
            <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                FreeMem( pRevData ); </span>//<span style="color: rgba(0, 0, 0, 1)"> 释放内存
                pCIER.Data :</span>= <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> pReqData &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
            FreeMem( pReqData ); </span>//<span style="color: rgba(0, 0, 0, 1)">释放内存
      FreeMem( pCIER ); </span>//<span style="color: rgba(0, 0, 0, 1)">释放内存
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TFtPing.GetReplyString( aResult: Integer; aIP: TIpInfo;
    pIPE: PCnIcmpEchoReply ): string;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    sHost: string;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> SInvalidAddr;
    </span><span style="color: rgba(0, 0, 255, 1)">case</span> aResult <span style="color: rgba(0, 0, 255, 1)">of</span>
      -<span style="color: rgba(128, 0, 128, 1)">100</span>: Result :=<span style="color: rgba(0, 0, 0, 1)"> SICMPRunError;
      </span>-<span style="color: rgba(128, 0, 128, 1)">1</span>: Result :=<span style="color: rgba(0, 0, 0, 1)"> SInvalidAddr;
      </span>-<span style="color: rgba(128, 0, 128, 1)">2</span>: Result :=<span style="color: rgba(0, 0, 0, 1)"> Format( SNoResponse, [ RemoteHost ] );
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> pIPE &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
                <span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
                  sHost :</span>=<span style="color: rgba(0, 0, 0, 1)"> aIP.IP;
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> aIP.Host &lt;&gt; <span style="color: rgba(128, 0, 0, 1)">''</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                        sHost :</span>= aIP.Host + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">: </span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> sHost;
                  Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> ( Format( SPingResultString, [ sHost, pIPE^.DataSize, pIPE^.RTT,
                        pIPE^.Options.TTL ] ) );
                </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.GetIPByName( <span style="color: rgba(0, 0, 255, 1)">const</span><span style="color: rgba(0, 0, 0, 1)"> aName: string;
    </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aIP: string ): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    pHost: PHostEnt;
    FWSAData: TWSAData;
    sName: </span><span style="color: rgba(0, 0, 255, 1)">array</span>[ <span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">255</span> ] <span style="color: rgba(0, 0, 255, 1)">of</span><span style="color: rgba(0, 0, 0, 1)"> AnsiChar;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
    </span>//    StrPCopy(sName, <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFDEF DELPHI12_UP</span><span style="color: rgba(0, 128, 0, 1)">}</span>AnsiString<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ENDIF</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">(aName));
    StrPCopy( sName, AnsiString( aName ) );
    aIP :</span>= <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> aName = <span style="color: rgba(128, 0, 0, 1)">''</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
      Exit;

    WSAStartup( $</span><span style="color: rgba(128, 0, 128, 1)">101</span><span style="color: rgba(0, 0, 0, 1)">, FWSAData );
    try
      pHost :</span>=<span style="color: rgba(0, 0, 0, 1)"> GetHostByName( @sName );
      Result :</span>= pHost &lt;&gt; <span style="color: rgba(0, 0, 255, 1)">nil</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> Result <span style="color: rgba(0, 0, 255, 1)">then</span>
            //            aIP := <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFDEF DELPHI12_UP</span><span style="color: rgba(0, 128, 0, 1)">}</span>string<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ENDIF</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">(inet_ntoa(PInAddr(pHost^.h_addr_list^)^));
            aIP :</span>=<span style="color: rgba(0, 0, 0, 1)"> string( inet_ntoa( PInAddr( pHost^.h_addr_list^ )^ ) );
    finally
      WSACleanup;
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



</span><span style="color: rgba(0, 0, 255, 1)">function</span> TFtPing.SetIP( aIPAddr, aHost: string; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> aIP: TIpInfo ): Boolean;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
    pIPAddr: PAnsiChar;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> False;
    aIP.Address :</span>=<span style="color: rgba(0, 0, 0, 1)"> INADDR_NONE;
    aIP.IP :</span>=<span style="color: rgba(0, 0, 0, 1)"> aIPAddr;
    aIP.Host :</span>=<span style="color: rgba(0, 0, 0, 1)"> aHost;
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> aIP.IP = <span style="color: rgba(128, 0, 0, 1)">''</span> <span style="color: rgba(0, 0, 255, 1)">then</span>
      <span style="color: rgba(0, 0, 255, 1)">begin</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> ( aIP.Host = <span style="color: rgba(128, 0, 0, 1)">''</span> ) <span style="color: rgba(0, 0, 255, 1)">or</span> ( <span style="color: rgba(0, 0, 255, 1)">not</span> GetIPByName( aIP.Host, aIP.IP ) ) <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
                Exit;
      </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

    GetMem( pIPAddr, Length( aIP.IP ) </span>+ <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> );
    try
      ZeroMemory( pIPAddr, Length( aIP.IP ) </span>+ <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> );
      </span>//      StrPCopy(pIPAddr, <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFDEF DELPHI12_UP</span><span style="color: rgba(0, 128, 0, 1)">}</span>AnsiString<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ENDIF</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">(aIP.IP));
      StrPCopy( pIPAddr, AnsiString( aIP.IP ) );
      aIP.Address :</span>= inet_addr( PAnsiChar( pIPAddr ) ); //<span style="color: rgba(0, 0, 0, 1)"> IP转换成无点整型
    finally
      FreeMem( pIPAddr ); </span>//<span style="color: rgba(0, 0, 0, 1)"> 释放申请的动态内存
    </span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
    Result :</span>= aIP.Address &lt;&gt;<span style="color: rgba(0, 0, 0, 1)"> INADDR_NONE;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;



initialization
    InitIcmpFunctions;



finalization
    FreeIcmpFunctions;

</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">.


</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">
调用方法
procedure TForm1.Button1Click( Sender: TObject );
var
    FtPing: TFtPing;
    aReply: string;
begin
    FtPing := TFtPing.Create( nil );
    try
      FtPing.RemoteIP := Edit1.Text;
      if FtPing.Ping( aReply ) then
            begin
                Memo1.Lines.Add( '网络畅通!' )
            end
      else
            begin
                Memo1.Lines.Add( '网络异常~~&gt;|&lt;~~' )
            end;
    finally
      FtPing.Free;
    end;
end;

</span><span style="color: rgba(0, 128, 0, 1)">}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>正则取匹配IP地址</p>
<div class="cnblogs_code">
<pre> Reg:=<span style="color: rgba(0, 0, 0, 1)">TPerlRegEx.Create;
      Reg.Subject:</span>=<span style="color: rgba(0, 0, 0, 1)">pos.ServerUrl;
      Reg.RegEx:</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">((2\d|25|?\d\d?)\.){3}(2\d|25|?\d\d?)</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span>reg.Match <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)">
IP:</span>=<span style="color: rgba(0, 0, 0, 1)">Reg.MatchedText
</span><span style="color: rgba(0, 0, 255, 1)">else</span>
//TODO没有获取到IP地址 </pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;</p><br><br>
来源:https://www.cnblogs.com/stroll/p/11583338.html
頁: [1]
查看完整版本: Delphi 实现Ping命令