ping IP 地址(返回false or true)
2009-12-10 15:51
330 查看
function TFrmSet.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;
FIPAddress:=inet_addr(PChar(HostIP));
MyString := 'Hello,World'; //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:=4000;
try
Result:=IcmpSendEcho(hICMP, FIPAddress,pReqData,
Length(MyString),nil,pIPE,BufferSize,FTimeOut)>0;
finally
IcmpCloseHandle(hICMP);
FreeLibrary(hICMPdll);
FreeMem(pRevData);
FreeMem(pIPE);
end; end;
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;
FIPAddress:=inet_addr(PChar(HostIP));
MyString := 'Hello,World'; //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:=4000;
try
Result:=IcmpSendEcho(hICMP, FIPAddress,pReqData,
Length(MyString),nil,pIPE,BufferSize,FTimeOut)>0;
finally
IcmpCloseHandle(hICMP);
FreeLibrary(hICMPdll);
FreeMem(pRevData);
FreeMem(pIPE);
end; end;
相关文章推荐
- 检查字符串是否为电话号码或邮箱地址方法,并返回true or false的判断值
- 检查字符串是否为电话号码或邮箱地址方法,并返回true or false的判断值
- null返回的true or false
- Python返回真假值(True or False)小技巧
- window.confirm 参数就只有一个。显示提示框的信息。按确定,返回true;按取消返回false。
- python 类中的__nozero__ ,__len__ 重写,可以定义对象的布尔值是True or False
- android返回键监听中return false,return true的区别
- registerWithTouchDispatcher & ccTouchBegan 备忘 true or false
- (14)Android监听时return 返回的false与true的区别
- 为什么在 Java 中1000==1000返回false,而100==100返回true呢?
- mysql_query() ,注意返回值可能为true或false
- Express框架中的req.fresh属性何时返回true,何时返回false
- Python: ping网段内所有ip并返回结果
- 论android:hardwareAccelerated="true"or"false"硬件加速的重要性(注:galleryiew/carview))
- 奇怪的Java题:为什么128 == 128返回为False,而127 == 127会返回为True?
- Python小技巧 – True or False
- 当其为质数返回true,否则返回false
- TP_Link R488多WAN口路由器花生壳功能配置,我都设置好了 但还是进不了 ping域名返回的IP是公网ip没错
- instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例 , 返回true或者false
- [置顶] 通过字段返回信息进行文本渲染(字段false或者true,显示文本内容)