function
PingHost(HostIP:
string
):
boolean
;
type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation =
packed
record
TTL:
Byte
;
TOS:
Byte
;
Flags:
Byte
;
OptionsSize:
Byte
;
OptionsData:
pchar
;
end
;
PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply =
packed
record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize:
WORD
;
Reserved:
WORD
;
Data:
Pointer
;
Options: TIPOptionInformation;
end
;
TIcmpCreateFile =
function
: THandle; stdcall;
TIcmpCloseHandle =
function
(IcmpHandle: THandle):
boolean
; stdcall;
TIcmpSendEcho =
function
(IcmpHandle: THandle; DestinationAddress: DWORD; RequestData:
Pointer
; RequestSize:
WORD
; RequestOptions: PIPOptionInformation; ReplyBuffer:
Pointer
; ReplySize: DWORD; Timeout: DWORD): DWORD; stdcall;
var
hICMP: THandle;
hICMPdll: THandle;
IcmpCreateFile: TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
pIPE: PIcmpEchoReply;
// ICMP Echo reply buffer
FIPAddress: DWORD;
FSize: DWORD;
FTimeOut: DWORD;
BufferSize: DWORD;
pReqData, pRevData:
pchar
;
MyString:
string
;
begin
result :=
false
;
hICMPdll := LoadLibrary(
'icmp.dll'
);
if
hICMPdll =
0
then
Exit;
@IcmpCreateFile := GetProcAddress(hICMPdll,
'IcmpCreateFile'
);
@IcmpCloseHandle := GetProcAddress(hICMPdll,
'IcmpCloseHandle'
);
@IcmpSendEcho := GetProcAddress(hICMPdll,
'IcmpSendEcho'
);
hICMP := IcmpCreateFile;
if
(hICMP = INVALID_HANDLE_VALUE)
then
Exit;
//uses winsock;
FIPAddress := inet_addr(
pchar
(HostIP));
//Delphi xe: inet_addr(PANSIChar(ansistring(HostIP)));
MyString :=
'Hello TaoRoy'
;
//send data buffer
pReqData :=
pchar
(MyString);
FSize :=
40
;
//receive data buffer
BufferSize := SizeOf(TIcmpEchoReply) + FSize;
GetMem(pIPE, BufferSize);
FillChar(pIPE^, SizeOf(pIPE^),
0
);
GetMem(pRevData, FSize);
pIPE^.Data := pRevData;
FTimeOut :=
50
;
//超时间隔毫秒
try
result := IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),
nil
, pIPE, BufferSize, FTimeOut) >
0
;
finally
IcmpCloseHandle(hICMP);
FreeLibrary(hICMPdll);
FreeMem(pRevData);
FreeMem(pIPE);
end
;
end
;