Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Не получается сделать пинг


Автор: MaXL 12.5.2006, 12:23
Привет всем.
Я использовал пример, который был  в Delphiworld, ноу меня всё равно не получается, вообщем нужно сделать пинг и вывести результаты, я сейчас просто пробовал вывести хоть какой-нибудь результата, но ничо не получается, во привожу процедуру, которая пингует:
Код

procedure do_ping(ResultEditCh:TCompS;hostt:string);stdcall;
var
 WSAData:TWSAData;
 Retorno:integer;
 dwRetorno :DWORD;
 x :integer;
 icmp :icmpecho;
 hndFile :integer;
 Host :PHostEnt;
 Addr :in_addr;
 Endereco :^DWORD;
 Destino :in_addr;

 IP : ipinfo;

 HNDicmp:HWND;

 IcmpCreateFile : TIcmpCreateFile;
 IcmpCloseHandle : TIcmpCloseHandle;
 IcmpSendEcho : TIcmpSendEcho;
begin
 if Length(hostt)<=0 then
  begin
   ResultEditCh(6,0,'');
   ResultEditCh(1,0,'Îøèáêà. Âû íå õîñò äëÿ ïèíãà.');
  end;
 HNDicmp:=LoadLibrary('icmp.dll');
 if HNDicmp=0 then
  begin
   ResultEditCh(6,0,'');
   ResultEditCh(1,0,'Íå óäàëîñü çàãððóçèòü icmp.dll.');
   exit;
  end;
 //ïîëó÷àåì àäðåñà ôóíêöèé â áèáëèîòåêå icmp.dll
 @IcmpCreateFile:=GetProcAddress(HNDicmp,'IcmpCreateFile');
 @IcmpCloseHandle:=GetProcAddress(HNDicmp,'IcmpCloseHandle');
 @IcmpSendEcho:=GetProcAddress(HNDicmp,'IcmpSendEcho');
 if (@IcmpCreateFile=nil) or (@IcmpClosehandle=nil) or
    (@IcmpSendEcho=nil) then
     begin
      ResultEditCh(6,0,'');
      ResultEditCh(1,0,'Ïðîáëåìû ñ áèáëèîòåêîé icmp.dll. Îáðàòèòåñü ê ðàçðîáîò÷èêàì!');
      FreeLibrary(HNDicmp);
      exit;
     end;

 Retorno:=WSAStartup($0101,WSAData);
 if (Retorno<>0) then
  begin
   ResultEditCh(6,0,'');
   ResultEditCh(1,0,'Íå óäàëîñü çàãðóçèòü Windows Sockets.');
   FreeLibrary(HNDicmp);
   exit;
  end;
 ResultEditCh(3,0,'');
 ResultEditCh(1,0,'Ïîèñê õîñòà');

 Destino.S_addr := inet_addr(Pchar(hostt));
 if (Destino.S_addr = 0) then
  Host := GetHostbyName(PChar(hostt))
 else
  Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);

 if (Host=nil) then
  begin
   ResultEditCh(6,0,'');
   ResultEditCh(1,0,'Õîñò íå íàéäåí');
   FreeLibrary(HNDicmp);
   exit;
  end;

 ResultEditCh(4,0,'');
 ResultEditCh(1,0,'Pinging '+hostt);

 Endereco := @Host.h_addr_list;
 HNDFile := IcmpCreateFile();
 for x:=1 to 4 do
  begin
   Ip.Ttl := char(255);
   Ip.Tos := char(0);
   Ip.IPFlags := char(60);
   Ip.OptSize := char(10);
   Ip.Options := nil;
   dwRetorno := IcmpSendEcho(HNDFile,Endereco^,0,0,Ip,Icmp,sizeof(Icmp),
   DWORD(5000));
   Addr.S_addr := icmp.source;
   ResultEditCh(5,0,'');
   ResultEditCh(1,0,IntToStr(icmp.RTTime));
  end;

 ResultEditCh(4,0,'');
 ResultEditCh(1,0,'Ïèíã çàêîí÷åí.');
 WSACleanup;
end;

 

Автор: Snowy 12.5.2006, 12:28
Возьми отсюда ping.pas http://forum.vingrad.ru/index.php?showtopic=65035&view=findpost&p=521765 

Автор: MaXL 12.5.2006, 13:40
Огромное спасибо. Сейчас буду разбираться  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)