还是先PING一下好,也不麻烦,在程序中可以这样实现:做个FORM,在主程序界面上加
个BUTTON或菜单项调用这个FORM(我平时的做法),完整代码如下:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,winsock, ExtCtrls;
type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation=packed record
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionsSize: Byte;
OptionsData: PChar;
end;
PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize:Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;
TIcmpCreateFile = function: THandle; stdcall;
TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
TIcmpSendEcho =
function(IcmpHandle:THandle;
DestinationAddress
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord )
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Word; stdcall;
TFtest = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle:TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
public
{ Public declarations }
WSAData:TWSAData;
end;
var
Ftest: TFtest;
i:integer;
implementation
{$R *.dfm}
uses main;
procedure TFtest.FormCreate(Sender: TObject);
var hiCMPdll:HMODULE;
{ IPOpt:TIPOptionInformation;
FIPAddress
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD;
pReqData,pRevData
![Stick Out Tongue :p :p](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Char;
pIPE
![Stick Out Tongue :p :p](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
IcmpEchoReply;
FSize: DWORD;
MyString:string;
FTimeOut
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD;
BufferSize
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD; }
begin
i:=0;
WSAStartup(2,WSAData);
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP :=IcmpCreateFile;
memo1.Text:='';
memo1.Lines.Add('数据中心连接测试信息:');
{FIPAddress:=inet_addr(pchar('127.0.0.1'));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := '-------Hello,World!---------------';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
ftimeout:=4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),
@IPOpt, pIPE, BufferSize, FTimeOut);
try
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
memo1.Lines.Add(PChar('127.0.0.1') + '-----'
+IntToStr(pIPE^.DataSize) + '-----' +IntToStr(pIPE^.RTT));
end;
except
memo1.Text:='';
memo1.Lines.Add('数据中心连接失败!请检查一下您的网络连接!');
end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
end; }
end;
procedure TFtest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
wsacleanup();
Action:=caFree;
end;
procedure TFtest.Timer1Timer(Sender: TObject);
var
IPOpt:TIPOptionInformation;
FIPAddress
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD;
pReqData,pRevData
![Stick Out Tongue :p :p](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Char;
pIPE
![Stick Out Tongue :p :p](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
IcmpEchoReply;
FSize: DWORD;
MyString:string;
FTimeOut
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD;
BufferSize
![Big Grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
WORD;
begin
i:=i+1;
FIPAddress:=inet_addr(pchar('127.0.0.1'));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := '-------Hello,World!---------------';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
ftimeout:=4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),
@IPOpt, pIPE, BufferSize, FTimeOut);
try
try
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
memo1.Lines.Add(' '+PChar(inttostr(i)+' '+'连接数据中心') + ' ----- 发送信息(字节):'
+IntToStr(pIPE^.DataSize) + ' ----- 返回时间(毫秒):' +IntToStr(pIPE^.RTT)+' ----- TTL:'+inttostr(pipe^.options.ttl));
end;
except
//memo1.Text:='';
memo1.Lines.Add(' 数据中心连接失败!请检查一下您的网络连接!');
memo1.Lines.Add(' '+PChar(inttostr(i)+' '+'连接数据中心') + ' ----- 发送信息(字节):'
+IntToStr(pIPE^.DataSize) + ' ----- 返回时间(毫秒):' +IntToStr(pIPE^.RTT)+' ----- TTL:'+inttostr(pipe^.options.ttl));
end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
end;
end;
end.