请问,在局域网里,我已知道别的机器的ip地址,我如何知道他的机器目前是否开机。 我的意思是一个类似ping的程序,可以从回应中知道他是否开机,但是我想把这个的功能做在程序里。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ping 它 (ping不通再 arp -a)or nbtstat -an 它 WinExec() ping 10.15.1.1>>c:\temp再把temp内容读出来,再把temp删了不就ok了? 去吧。它不开机你能Ping得通吗? 用类似PING的方法是可以实现的(做在程序里)ping是ICMP协议中的一个功能,通过对Icmp.dll中函数的调用就可以实现PING操作。程序清单如下:unit Unit1;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,WinSock;typePIPOptionInformation=^TIPOptionInformation;TIPOptionIformation=packed record //定义TIPOptionInformatio记录OptionsSize,Ttl,Tos,Flags:Bytes;//Ttl,Time to live;Tos,Type of Service;OptionsData:PChar;end;PIcmpEchoReply=^TIcmpEchoReply;TIcmpEchoReply=packed record //定义TIcmpEchoReply的记录Address,Status,Rtt,DataSize,Reserved:DWord;Data:Pointer;Options:TIPOptionInformation;end;//以下定义三个类函数,以便从ICMP.dll中引出我们要用的函数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;TTMyPing=class(TForm) PingEdit:TEdit; Label1:TLabel; StatusShow:TMemo; exeBtn:TButton; procedure FormCreate(Sender:TObject); procedure FormClose(Sender:TObject;var Action:TCloseAction); procedure exeBtnClick(Sender:TObject);privatepublicend;var TMyPing:TTMyping;implementation{$R *.DFM}procedure TTMyPing.exeBtnClick(Sender:TObject);var IPOpt:TIPOptionInformation;//随包发送的IP选项信息 FIPAddress:DWord; pReqData,pRevData:PChar; pIPE:PIcmpEchoReply;//ICMP ECHO回复缓冲区 FSize:DWord; MyString:String; FTimeOut,BufferSize:DWord;begin if PingEdit<>'' then begin FIPAddress:=inet_addr(PChar(PingEdit.Text)); FSize:=40; BufferSize:=SizeOf(TIcmpEchoReply)+FSize; GetMem(pRevData,FSize); GetMem(pIPE,BufferSize); FillChar(pIPE^,SizeOf(pIPE^),0); pIPE^.Data:=pRevData; MyString:='PsWaker22';//ping发送数据包的信息,可以随便改 pReqData:=PChar(MyString); FillChar(IPOpt,SizeOf(IPOpt),0); IPOpt.Ttl:=64; FTimeOut:=4000;//每次等待响应的时间为4秒 IcmpSendEcho(hICMP,FIPAddress,pReqData,Length(MyString),@IPOpt, pIPE,BufferSize,FTimeOut); try try if pReqData^=pIPE^.Options.OptionsData^ then begin StatusShow.Lins.Add(PChar(PingEdit.Text)+'---'+ IntToStr(pIPE^.DataSize)+ '---'+ IntToStr(pIPE^.Rtt); end; except ShowMessage('没有找到该IP地址'); end; finally FreeMem(pRevData); FreeMem(pIPE); end; end else ShowMessage('请输入对方IP‘);end;procedure TTMyPing.FormCreate(Sender:TObject);var WsaData:TWsaData; hIcmpdll:HMODULE;begin WsaStartup(2,WsaData);//2是所需的winsock.dll的版本号 hICMPdll:=LoadLiabrary('ICMP.dll');//加载ICMP.dll动态连接库 @ICMPCreateFile:=GetProcAddress(hICMPdll,'ICMPCreateFile'); //引出ICMP.dll中的IcmpCreateFile函数 @IcmpCloseHandle:=GetProcAddress(hICMPdll,'IcmpCloseHandle'); //引出ICMP.dll中的IcmpCloseHandle函数 @IcmpSendEcho:=GetProcAddress(hICMPdll,'IcmpSendEcho'); //不用我再说明了吧,呵呵~~~ hICMP:=IcmpCreateFile; StatusShow.Text:=''; StatusShow.Lines.Add('目的IP地址----字节数----返回时间(毫秒)');end;procedure TTMyPing.FormClose(Sender:TObject)begin WsaCleanUp();//执行wsaStartUp调用的清除工作,释放WinSock.dll占用的资源end;end.呵呵~~~这位yong98朋友,这回满意了吧:) 简单问题,如何判断焦点 有关从datasetA获取datasetB的问题 关于DBGRID的只读属性问题。解决了就给分 郁闷!!!!!!!!!!!!!!!!!!!!散分。。。。。。。。 哪有VideoCap的使用说明? SQL中自动增加字段出错?? 50分征好图标的http链接 这样为什么报错panel1.top:=form1.Height/2; 怎样在一次SQL语句中的提交中即返回满足条件的记录数量又返回记录集呢? Delphi问题:在客户机上如何得到当前NT服务器名? 对*.INI文件怎么读写,请指教。 关于NMFTP控件的困惑
or nbtstat -an 它
再把temp内容读出来,再把temp删了不就ok了?
ping是ICMP协议中的一个功能,通过对Icmp.dll中函数的调用就可以实现PING操作。
程序清单如下:
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,
WinSock;
type
PIPOptionInformation=^TIPOptionInformation;
TIPOptionIformation=packed record //定义TIPOptionInformatio记录
OptionsSize,Ttl,Tos,Flags:Bytes;//Ttl,Time to live;Tos,Type of Service;
OptionsData:PChar;
end;
PIcmpEchoReply=^TIcmpEchoReply;
TIcmpEchoReply=packed record //定义TIcmpEchoReply的记录
Address,Status,Rtt,DataSize,Reserved:DWord;
Data:Pointer;
Options:TIPOptionInformation;
end;
//以下定义三个类函数,以便从ICMP.dll中引出我们要用的函数
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;
TTMyPing=class(TForm)
PingEdit:TEdit;
Label1:TLabel;
StatusShow:TMemo;
exeBtn:TButton;
procedure FormCreate(Sender:TObject);
procedure FormClose(Sender:TObject;var Action:TCloseAction);
procedure exeBtnClick(Sender:TObject);
privatepublicend;var
TMyPing:TTMyping;
implementation
{$R *.DFM}
procedure TTMyPing.exeBtnClick(Sender:TObject);
var
IPOpt:TIPOptionInformation;//随包发送的IP选项信息
FIPAddress:DWord;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;//ICMP ECHO回复缓冲区
FSize:DWord;
MyString:String;
FTimeOut,BufferSize:DWord;
begin
if PingEdit<>'' then
begin
FIPAddress:=inet_addr(PChar(PingEdit.Text));
FSize:=40;
BufferSize:=SizeOf(TIcmpEchoReply)+FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^,SizeOf(pIPE^),0);
pIPE^.Data:=pRevData;
MyString:='PsWaker22';//ping发送数据包的信息,可以随便改
pReqData:=PChar(MyString);
FillChar(IPOpt,SizeOf(IPOpt),0);
IPOpt.Ttl:=64;
FTimeOut:=4000;//每次等待响应的时间为4秒
IcmpSendEcho(hICMP,FIPAddress,pReqData,Length(MyString),@IPOpt,
pIPE,BufferSize,FTimeOut);
try
try
if pReqData^=pIPE^.Options.OptionsData^ then
begin
StatusShow.Lins.Add(PChar(PingEdit.Text)+'---'+
IntToStr(pIPE^.DataSize)+ '---'+
IntToStr(pIPE^.Rtt);
end;
except
ShowMessage('没有找到该IP地址');
end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
end;
end
else
ShowMessage('请输入对方IP‘);
end;
procedure TTMyPing.FormCreate(Sender:TObject);
var
WsaData:TWsaData;
hIcmpdll:HMODULE;
begin
WsaStartup(2,WsaData);//2是所需的winsock.dll的版本号
hICMPdll:=LoadLiabrary('ICMP.dll');//加载ICMP.dll动态连接库
@ICMPCreateFile:=GetProcAddress(hICMPdll,'ICMPCreateFile');
//引出ICMP.dll中的IcmpCreateFile函数
@IcmpCloseHandle:=GetProcAddress(hICMPdll,'IcmpCloseHandle');
//引出ICMP.dll中的IcmpCloseHandle函数
@IcmpSendEcho:=GetProcAddress(hICMPdll,'IcmpSendEcho');
//不用我再说明了吧,呵呵~~~
hICMP:=IcmpCreateFile;
StatusShow.Text:='';
StatusShow.Lines.Add('目的IP地址----字节数----返回时间(毫秒)');
end;
procedure TTMyPing.FormClose(Sender:TObject)
begin
WsaCleanUp();//执行wsaStartUp调用的清除工作,释放WinSock.dll占用的资源
end;
end.
呵呵~~~这位yong98朋友,这回满意了吧:)