Indy IdICMPClient com laço FOR

18/06/2021

0

Boa tarde pessoal, já estou há dias pesquisando na internet mas me sinto correndo atrás do próprio rabo, preciso verificar em uma rede /24 quais ips estão ativos e depois tratar os ips.
Meu problema é o seguinte: sempre que uso laço FOR para alimentar o idICMPclient.host ele me retorna o erro
10040 message too long
. Como posso fazer para verificar, dentre as 254 possibilidades, quem está ativo?

Este foi o código que testei no delphi tokyo.
function TForm1.PingaIP(IP: String): boolean;
begin

with IdIcmpClient1 do begin
Host := IP;
ReceiveTimeout := 500;
Ping;
if ReplyStatus.BytesReceived > 0 then
result := true
else
result := false;
end;

end;


E no botão:
procedure TForm1.Button1Click(Sender: TObject);
Var
i: integer;
begin
for I := 1 to 254 do
begin

if PingaIP('192.168.0.'+inttostr(i)) = True then
Memo1.lines.add('192.168.0.'+inttostr(i));

end;
end;


Por favor, me ajudem a solucionar isso. Não posso usar softwares de 3º por precisar desses dados dentro da minha aplicação.
Jean Ribeiro

Jean Ribeiro

Responder

Post mais votado

20/06/2021

código completo:
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdRawBase, IdRawClient, IdIcmpClient, IdGlobal;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    CancelaPing: boolean;
    function PingaIP(strIP: string): boolean;
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

function TForm3.PingaIP(strIP: string): boolean;
var
  ICMP : TIdIcmpClient;
  ABuffer: String;
begin
  ICMP := TIdIcmpClient.Create(nil); // crio o componente em tempo de execução
  try
    try
      ICMP.PacketSize := 32;
      ICMP.Host := strIP;
      ICMP.ReceiveTimeout := 500;
      ICMP.Protocol := 1;
      ICMP.IPVersion := Id_IPv4;
      ABuffer := ICMP.Host + StringOfChar(' ', 255);
      ICMP.Ping(ABuffer); // envio um conteúdo para o ping
      if ICMP.ReplyStatus.BytesReceived > 0 then
        Result := True
      else
        Result := False;
     except
       Result  := False;
     end;
  finally
    ICMP.Destroy;
  end;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  i: integer;
  baseIP, IP: string;
begin
  TWinControl(Sender).Enabled := False;
  Memo1.Lines.Clear;
  baseIP := Edit1.Text;
  CancelaPing := False;
  for I := 0 to 254 do
  begin
    IP := baseIP+inttostr(i);
    if PingaIP(IP) then
      Memo1.Lines.Add(IP + ': Ok')
    else
      Memo1.Lines.Add(IP + ': Falha');
    Application.ProcessMessages;

    if CancelaPing then
      break;
  end;
  TWinControl(Sender).Enabled := True;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  CancelaPing := True;
end;

end.

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

21/06/2021

Wanderson Cardoso

Alguém sabe com faço para trazer os dados de uma planilha Excel para um DBGrid?
Já pesquisei muito só que até agora não achei uma solução!
Será que alguém pode me ajudar ?
Desde já agradeço!
Responder

25/06/2021

Jean Ribeiro

código completo:
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdRawBase, IdRawClient, IdIcmpClient, IdGlobal;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    CancelaPing: boolean;
    function PingaIP(strIP: string): boolean;
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

function TForm3.PingaIP(strIP: string): boolean;
var
  ICMP : TIdIcmpClient;
  ABuffer: String;
begin
  ICMP := TIdIcmpClient.Create(nil); // crio o componente em tempo de execução
  try
    try
      ICMP.PacketSize := 32;
      ICMP.Host := strIP;
      ICMP.ReceiveTimeout := 500;
      ICMP.Protocol := 1;
      ICMP.IPVersion := Id_IPv4;
      ABuffer := ICMP.Host + StringOfChar(' ', 255);
      ICMP.Ping(ABuffer); // envio um conteúdo para o ping
      if ICMP.ReplyStatus.BytesReceived > 0 then
        Result := True
      else
        Result := False;
     except
       Result  := False;
     end;
  finally
    ICMP.Destroy;
  end;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  i: integer;
  baseIP, IP: string;
begin
  TWinControl(Sender).Enabled := False;
  Memo1.Lines.Clear;
  baseIP := Edit1.Text;
  CancelaPing := False;
  for I := 0 to 254 do
  begin
    IP := baseIP+inttostr(i);
    if PingaIP(IP) then
      Memo1.Lines.Add(IP + ': Ok')
    else
      Memo1.Lines.Add(IP + ': Falha');
    Application.ProcessMessages;

    if CancelaPing then
      break;
  end;
  TWinControl(Sender).Enabled := True;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  CancelaPing := True;
end;

end.


Perfeito, simplesmente perfeito.
Responder

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

Aceitar