Fórum Ping #340569
18/04/2007
0
Usei o ICMP do indy para pingar determinados endereços IPs. Li tambem que o icmp.ReplyData retornaria alguma coisa informando o sucesso ou não do envio. Me retorna sempre EEEEEEEEEEEEEEEE, o endereço existindo ou não.
Pergunta: Como posso ter um retorno se o endereço que pinguei está no ar ou não ?
Guilherme B
Curtir tópico
+ 0Posts
18/04/2007
Massuda
Gostei + 0
18/04/2007
Guilherme B
A rotina já da erro na compilação.
Não acha por exemplo: IdIcmp.PacketSize , IdIcmp.PacketSize, AReplyStatus.Msg , etc.
Estou usando Delphi 7.
Gostei + 0
18/04/2007
Massuda
Gostei + 0
18/04/2007
Guilherme B
Continua não funcionando.
Gostei + 0
18/04/2007
Massuda
Gostei + 0
18/04/2007
Guilherme B
Acontecem os mesmos erros anteriores já na compilação.
Os endereços que quero pingar são internos.
Gostei + 0
18/04/2007
Massuda
Se você tem firewall, liberou seu programa para enviar/receber dados ICMP? Fora isso, pode ser que as máquinas que você está pingando tenham firewall que impede resposta a ping.
Gostei + 0
18/04/2007
Guilherme B
IdIcmp.PacketSize , IdIcmp.PacketSize, AReplyStatus.Msg , etc.
Gostei + 0
18/04/2007
Aloizio Castro
Mas o codigo fica assim:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure OnReply(ASender: TComponent; const AReplyStatus: TReplyStatus);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.OnReply(ASender: TComponent; const AReplyStatus: TReplyStatus);
begin
//-- Analisa o retorno do ping
if AReplyStatus.Msg <> ´´then
begin
ShowMessage(AReplyStatus.Msg);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
TimeOut : Word = 1000;
var
IdIcmp : TIdIcmpClient;
begin
IdIcmp := TIdIcmpClient.Create(nil);
IdIcmp.Host := ´127.0.0.1´;
IdIcmp.PacketSize := 128;
IdIcmp.Port := 0;
IdIcmp.Protocol := 1;
IdIcmp.ProtocolIPv6 := 58;
IdIcmp.ReceiveTimeout := TimeOut;
IdIcmp.OnReply := OnReply;
IdIcmp.Ping();
FreeAndNil(IdIcmp);
end;
end.
Comigo funciona!
Estou usando Delphi 2006 com Indy 10.1.5 que acompanha o Delphi
Gostei + 0
18/04/2007
Guilherme B
Copiei o seu código no Delphi 7.
Veja os erros que deram:
[Error] Unit1.pas(36): Undeclared identifier: ´PacketSize´
[Error] Unit1.pas(39): Undeclared identifier: ´ProtocolIPv6´
[Error] Unit1.pas(16): Unsatisfied forward or external declaration: ´TForm1.onReply´
Gostei + 0
18/04/2007
Aloizio Castro
Copiei o seu código no Delphi 7.
Veja os erros que deram:
[Error] Unit1.pas(36): Undeclared identifier: ´PacketSize´
[Error] Unit1.pas(39): Undeclared identifier: ´ProtocolIPv6´
[Error] Unit1.pas(16): Unsatisfied forward or external declaration: ´TForm1.onReply´[/quote:0fd0d0ac23]
Delphi 7 eu nao tenho, tenho soh o D6 e BDS 2k6!
Para funcionar no D6 adaptei o codigo como vc pode ver abaixo e funcionou!!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure OnReply(ASender: TComponent; const AReplyStatus: TReplyStatus);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.OnReply(ASender: TComponent; const AReplyStatus: TReplyStatus);
begin
//-- Analisa o retorno do ping
if AReplyStatus.FromIpAddress = ´0.0.0.0´ then
ShowMessage(´Ping falhou´)
else
ShowMessage(AReplyStatus.FromIpAddress);
end;
procedure TForm1.Button1Click(Sender: TObject);
const
TimeOut : Word = 1000;
var
IdIcmp : TIdIcmpClient;
begin
IdIcmp := TIdIcmpClient.Create(nil);
//IdIcmp.Host := ´127.0.0.19´;
IdIcmp.Host := ´192.168.10.39´;
//IdIcmp.PacketSize := 128;
IdIcmp.Port := 0;
IdIcmp.Protocol := 1;
//IdIcmp.ProtocolIPv6 := 58;
IdIcmp.ReceiveTimeout := TimeOut;
IdIcmp.OnReply := OnReply;
IdIcmp.Ping();
FreeAndNil(IdIcmp);
end;
end.Espero q funcione tb no D7
Abraços :wink:
Gostei + 0
18/04/2007
Massuda
Ao executar, se ocorrer o erro ´cannot allocate socket´, então você está usando Win NT/2K/XP e não é membro do grupo de administradores.
Nesse caso, talvez seja melhor usar o código sugerido neste artigo do site delphi.about.com: [url=http://delphi.about.com/od/internetintranet/l/aa081503a.htm]Implementing PING without using raw sockets[/url].
Gostei + 0
18/04/2007
Guilherme B
Agradeço a todos as dicas e estarei verificando as duas opções sugeridas por vocês.
Valew
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)