如何使用API中的ping功能?最好给个例子!谢谢 结合第三方控件TPINGconst IP:string;判断某台计算机是否在线ping1.Address :=IP;result:=Ping1.Ping>0; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找到icmp.dll,引出其中 的 函数 ,就 可以实现ping的功能 了 。具体函数名和声明你可以 查以前的 帖子。随便一个delphi技巧之类的 书上都有的 。ping不是api函数 ,是操作系统带的一个 工具。 在Delphi6中: Inet_Addr: TInet_AddrProc = nil; //即FIPAddress := inet_addr(PChar(HostIP));不能执行啊! //怎么办!!!Top 回复人: kylion(凯林) ( ) 信誉:100 2002-1-14 14:24:02 得分:0 我知道为什么上面的代码出错的原因了。在调用idWinSock.pas的函数之前要对这些函数初始化!必须调用loadwinsock过程。即(可以执行的ping函数代码):unit UnitICMP;interfaceuses Windows, Classes;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: PIcmpEchoReply; ReplySize: DWord; Timeout: DWord ): DWord; stdcall; procedure InitICMP(Lines:Tstrings); procedure Ping(Host:string; Lines:Tstrings);var hICMP: THANDLE; IcmpCreateFile : TIcmpCreateFile; IcmpCloseHandle: TIcmpCloseHandle; IcmpSendEcho: TIcmpSendEcho;implementationuses IdWinsock, SysUtils;procedure InitICMP(Lines:Tstrings);//初始化ICMP库函数var // WSAData: TWSAData; hICMPdll: HMODULE;begin //WSAStartup($0202, WSAData); // Load the icmp.dll stuff hICMPdll := LoadLibrary('icmp.dll'); @ICMPCreateFile := GetProcAddress(hICMPdll,'IcmpCreateFile'); @IcmpCloseHandle := GetProcAddress(hICMPdll,'IcmpCloseHandle'); @IcmpSendEcho := GetProcAddress(hICMPdll,'IcmpSendEcho'); hICMP := IcmpCreateFile; Lines.Add('目的IP地址 字节数 返回时间(毫秒)'); end;procedure Ping(Host:string; Lines:Tstrings);var IPOpt:TIPOptionInformation; // IP Options for packet to send FIPAddress:DWORD; pReqData,pRevData:PChar; pIPE:PIcmpEchoReply;// ICMP Echo reply buffer FSize: DWORD; MyString:string; FTimeOut:DWORD; BufferSize:DWORD;begin //首先检验是否为合法IP if Host <> '' then begin LoadWinsock;//帖子上的几乎所有的关于ping的代码都没有这句。但在Delphi6中是必需的。 FIPAddress := inet_addr(PChar(Host)); 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); if pReqData^ = pIPE^.Options.OptionsData^ then begin Lines.Add(Host + ' '+IntToStr(pIPE^.DataSize) +' '+IntToStr(pIPE^.RTT)); end; FreeMem(pRevData); FreeMem(pIPE); end; end; end. 新手求助数组问题,谢谢! 用Help & Manual的朋友请进 请教如何用DELPHI做个监听程序判断机器是否打开某个网页呢? 皮肤控件一问 txt(或Word)导入数据库的问题,求救于各位大侠!!!!!!!在线等,,,, ADVStringGrid、DBADVStringGrid如何设置点击标题列自动排序 引号在adoquery.sql.add中怎表示? 哪有开发DELPHI+ SQL SERVER的B/S的资料? 报表中的照片问题,如能帮我,感激不尽! 多多指点。。。。 关于读取MS SQL中Pubs所有表名的问题!在线等待! 100分求教:用什么控件可以进行可视化网页设计
具体函数名和声明你可以 查以前的 帖子。随便一个delphi技巧之类的 书上都有的 。ping不是api函数 ,是操作系统带的一个 工具。
//即FIPAddress := inet_addr(PChar(HostIP));不能执行啊!
//怎么办!!!
Top
回复人: kylion(凯林) ( ) 信誉:100 2002-1-14 14:24:02 得分:0 我知道为什么上面的代码出错的原因了。
在调用idWinSock.pas的函数之前要对这些函数初始化!
必须调用loadwinsock过程。
即(可以执行的ping函数代码):
unit UnitICMP;
interface
uses Windows, Classes;
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: PIcmpEchoReply;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall;
procedure InitICMP(Lines:Tstrings);
procedure Ping(Host:string; Lines:Tstrings);
var
hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
implementation
uses IdWinsock, SysUtils;
procedure InitICMP(Lines:Tstrings);//初始化ICMP库函数
var
// WSAData: TWSAData;
hICMPdll: HMODULE;
begin
//WSAStartup($0202, WSAData);
// Load the icmp.dll stuff
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll,'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll,'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll,'IcmpSendEcho');
hICMP := IcmpCreateFile;
Lines.Add('目的IP地址 字节数 返回时间(毫秒)');
end;
procedure Ping(Host:string; Lines:Tstrings);
var
IPOpt:TIPOptionInformation;
// IP Options for packet to send
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;// ICMP Echo reply buffer
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;
begin
//首先检验是否为合法IP
if Host <> '' then
begin
LoadWinsock;//帖子上的几乎所有的关于ping的代码都没有这句。但在Delphi6中是必需的。
FIPAddress := inet_addr(PChar(Host));
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); if pReqData^ = pIPE^.Options.OptionsData^ then
begin
Lines.Add(Host + ' '+IntToStr(pIPE^.DataSize) +' '+IntToStr(pIPE^.RTT));
end; FreeMem(pRevData);
FreeMem(pIPE); end;
end; end.