Ping
Embora tenha visto vários tópicos no Site sobre o assunto, gostaria que me ajudassem:
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 ?
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
Curtidas 0
Respostas
Massuda
18/04/2007
:arrow: [url=http://forum.clubedelphi.net/viewtopic.php?t=80995]Neste tópico[/url] tem um exemplo do anderson de como fazer o ping com o Indy, mas note que esse exemplo funciona em máquinas com WinXP somente se você for administrador da máquina.
GOSTEI 0
Guilherme B
18/04/2007
Massuda, obrigado pela resposta.
A rotina já da erro na compilação.
Não acha por exemplo: IdIcmp.PacketSize , IdIcmp.PacketSize, AReplyStatus.Msg , etc.
Estou usando Delphi 7.
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
Massuda
18/04/2007
Precisa ter no [b:7ece1eb5a6]uses[/b:7ece1eb5a6] da sua unit: IdBaseComponent, IdComponent, IdRawBase, IdRawClient e IdIcmpClient.
GOSTEI 0
Guilherme B
18/04/2007
Massuda,
Continua não funcionando.
Continua não funcionando.
GOSTEI 0
Massuda
18/04/2007
Qual windows você usa? Tem firewall? usa proxy?
GOSTEI 0
Guilherme B
18/04/2007
XP, Symantec.
Acontecem os mesmos erros anteriores já na compilação.
Os endereços que quero pingar são internos.
Acontecem os mesmos erros anteriores já na compilação.
Os endereços que quero pingar são internos.
GOSTEI 0
Massuda
18/04/2007
[quote:fb2659c784=´GUILHERME B´]Acontecem os mesmos erros anteriores já na compilação.[/quote:fb2659c784]Que erros?
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.
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
Guilherme B
18/04/2007
Eu não executo a aplicação pois dá erro na compilação.
IdIcmp.PacketSize , IdIcmp.PacketSize, AReplyStatus.Msg , etc.
IdIcmp.PacketSize , IdIcmp.PacketSize, AReplyStatus.Msg , etc.
GOSTEI 0
Aloizio Castro
18/04/2007
Desculpe me intrometer no topico!
Mas o codigo fica assim:
Comigo funciona!
Estou usando Delphi 2006 com Indy 10.1.5 que acompanha o Delphi
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
Guilherme B
18/04/2007
Anderson, fique a vontade.
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´
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
Aloizio Castro
18/04/2007
[quote:0fd0d0ac23=´GUILHERME B´]Anderson, fique a vontade.
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!!
Espero q funcione tb no D7
Abraços :wink:
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
Massuda
18/04/2007
Na verdade, basta configurar a propriedade TIdIcmpClient.Host e o evento TIdIcmpClient.OnReply.
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].
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
Guilherme B
18/04/2007
Massuda e Anderson !
Agradeço a todos as dicas e estarei verificando as duas opções sugeridas por vocês.
Valew
Agradeço a todos as dicas e estarei verificando as duas opções sugeridas por vocês.
Valew
GOSTEI 0