Delphi 实现Ping命令
<p>Delphi 实现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 <> <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 <> <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 <> 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 > <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 <> 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 <> 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 ) >= <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 < <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 > <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 >= <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 ) >= <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 ) >= <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 ) >= <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 <= <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 ) <> <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><> <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 <> <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 <> <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 <> <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 <> <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 <> <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 <><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( '网络异常~~>|<~~' )
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> </p>
<p> </p><br><br>
来源:https://www.cnblogs.com/stroll/p/11583338.html
頁:
[1]