Selecao DevMedia QUERO SER PRIME

Fórum Ping #340569

18/04/2007

0

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 ?


Guilherme B

Guilherme B

Responder

Posts

18/04/2007

Massuda

: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.


Responder

Gostei + 0

18/04/2007

Guilherme B

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.


Responder

Gostei + 0

18/04/2007

Massuda

Precisa ter no [b:7ece1eb5a6]uses[/b:7ece1eb5a6] da sua unit: IdBaseComponent, IdComponent, IdRawBase, IdRawClient e IdIcmpClient.


Responder

Gostei + 0

18/04/2007

Guilherme B

Massuda,

Continua não funcionando.


Responder

Gostei + 0

18/04/2007

Massuda

Qual windows você usa? Tem firewall? usa proxy?


Responder

Gostei + 0

18/04/2007

Guilherme B

XP, Symantec.
Acontecem os mesmos erros anteriores já na compilação.
Os endereços que quero pingar são internos.


Responder

Gostei + 0

18/04/2007

Massuda

[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.


Responder

Gostei + 0

18/04/2007

Guilherme B

Eu não executo a aplicação pois dá erro na compilação.
IdIcmp.PacketSize , IdIcmp.PacketSize, AReplyStatus.Msg , etc.


Responder

Gostei + 0

18/04/2007

Aloizio Castro

Desculpe me intrometer no topico!

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


Responder

Gostei + 0

18/04/2007

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´


Responder

Gostei + 0

18/04/2007

Aloizio Castro

[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!!

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:


Responder

Gostei + 0

18/04/2007

Massuda

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].


Responder

Gostei + 0

18/04/2007

Guilherme B

Massuda e Anderson !

Agradeço a todos as dicas e estarei verificando as duas opções sugeridas por vocês.

Valew


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar