我的意思是一个类似ping的程序,可以从回应中知道他是否开机,但是我想把这个的功能做在程序里。

解决方案 »

  1.   

    ping 它 (ping不通再 arp -a)
    or nbtstat -an 它
      

  2.   

    WinExec() ping 10.15.1.1>>c:\temp
    再把temp内容读出来,再把temp删了不就ok了?
      

  3.   

    去吧。它不开机你能Ping得通吗?
      

  4.   

    用类似PING的方法是可以实现的(做在程序里)
    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朋友,这回满意了吧:)