Ir para conteúdo
Fórum Script Brasil
  • 0

Programa Ping por Range


Leonardo Silva

Pergunta

Bom Dia,

Criei um sistema para pingar algumas maquinas aqui na empresa, porém, executando ele em uma Faixa de IP ele funciona, porém na segunda faixa de IP ele sempre me retorna o valor false e não sei o que fazer, pois é estranho, deveria funcionar em ambas sem problemas, a duvida é, como fazer isso. Codigo.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs,IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient,

StdCtrls, Buttons;

type

TForm1 = class(TForm)

ICMP: TIdIcmpClient;

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure ICMPReply(ASender: TComponent;

const AReplyStatus: TReplyStatus);

procedure ICMPStatus(ASender: TObject;

const AStatus: TIdStatus; const AStatusText: String);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

_PingOK : Boolean;

function Ping (HostName: string): boolean;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ICMPReply(ASender: TComponent;

const AReplyStatus: TReplyStatus);

begin

try

if AReplyStatus.BytesReceived > 0 then

_PingOK := True

else

_PingOK := False;

except

_PingOK := False;

end;

end;

procedure TForm1.ICMPStatus(ASender: TObject;

const AStatus: TIdStatus; const AStatusText: String);

begin

try

_PingOK := True;

except

_PingOK := False;

end

end;

function TForm1.Ping(HostName: string): boolean;

var

ICMP : TIdIcmpClient;

begin

try

ICMP := TIdIcmpClient.Create(Application);

try

ICMP.OnStatus := Form1.ICMPStatus;

ICMP.OnReply := Form1.ICMPReply;

ICMP.Host := HostName;

ICMP.ReceiveTimeout := 500;

ICMP.port := 80;

ICMP.Ping;

Sleep(1);

Application.ProcessMessages;

Result := _PingOK;

except

result := false;

end;

finally

FreeAndNil(ICMP);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

const

Host = ' 10.114.4.101 ' ;

begin

if Ping(Host) then

showmessage(host + ' Online ')

else

showmessage(host + ' Offline');

end;

procedure TForm1.Button2Click(Sender: TObject);

const

Host = '10.114.4.8 ' ;

begin

if Ping(Host) then

showmessage(host + ' Online ')

else

showmessage(host + ' Offline');

end;

procedure TForm1.Button3Click(Sender: TObject);

const

Host = '10.162.4.108' ;

begin

if Ping(Host) then

showmessage(host + ' Online ')

else

showmessage(host + ' Offline');

end;

end.

PS.: O Servidor possue duas placas de rede cada qual com uma faixa de IP

Grato.

Editado por Leonardo Silva
Link para o comentário
Compartilhar em outros sites

25 respostass a esta questão

Posts Recomendados

  • 0

Jhonas, Reescrevi o mesmo e o problema se resolveu, porém me deparo com outro problema agora, depois de quase pronto, resolvi trocar os Showmessage por Statusbar.panels para apresentar a mensagen de Online e Offline na status bar, usando timer para execução automatica, mas o programa roda normal, faz a função do Timer, das progressbar, da Ping e ate faz Café :closedeyes: , porém o bendito não me apresenta a Mensagen de Online ou Offline na Statusbar, Debuguei o programa e a tragetoria do programa esta normal, sem nenhum erro aparente, Irei posta o codigo aqui para dar uma olhada, mas não entendo o do porque ele não estar apresentando o mesmo.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs,IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient,

StdCtrls, Buttons, ComCtrls, ExtCtrls, TeeProcs, TeEngine, Chart,

TeeFunci, Series;

type

TForm1 = class(TForm)

ICMP: TIdIcmpClient;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

Button7: TButton;

Button8: TButton;

Label1: TLabel;

ProgressBar1: TProgressBar;

ProgressBar2: TProgressBar;

ProgressBar3: TProgressBar;

ProgressBar4: TProgressBar;

ProgressBar5: TProgressBar;

ProgressBar6: TProgressBar;

ProgressBar7: TProgressBar;

ProgressBar8: TProgressBar;

Button9: TButton;

Button10: TButton;

ProgressBar9: TProgressBar;

ProgressBar10: TProgressBar;

Timer1: TTimer;

Panel1: TPanel;

Panel2: TPanel;

Panel3: TPanel;

Panel4: TPanel;

Panel5: TPanel;

Panel6: TPanel;

Panel7: TPanel;

Panel8: TPanel;

Panel9: TPanel;

Panel10: TPanel;

Panel11: TPanel;

Panel12: TPanel;

Panel13: TPanel;

Panel14: TPanel;

Panel15: TPanel;

Panel16: TPanel;

Panel17: TPanel;

Panel18: TPanel;

Panel19: TPanel;

Panel20: TPanel;

StatusBar1: TStatusBar;

Timer2: TTimer;

procedure ICMPReply(ASender: TComponent;

const AReplyStatus: TReplyStatus);

procedure ICMPStatus(ASender: TObject;

const AStatus: TIdStatus; const AStatusText: String);

procedure Button1Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure Timer2Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

_PingOK : Boolean;

function Ping (HostName: string): boolean;

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//Resposta do Status de Ping para o Programa

procedure TForm1.ICMPReply(ASender: TComponent;

const AReplyStatus: TReplyStatus);

begin

try

if AReplyStatus.BytesReceived > 0 then

_PingOK := True

else

_PingOK := False;

except

_PingOK := False;

end;

end;

//Check do Status para resposta no Ping

procedure TForm1.ICMPStatus(ASender: TObject;

const AStatus: TIdStatus; const AStatusText: String);

begin

try

_PingOK := True;

except

_PingOK := False;

end

end;

//Função para Verificação e Ping do Host.

function TForm1.Ping(HostName: string): boolean;

var

ICMP : TIdIcmpClient;

begin

try

ICMP := TIdIcmpClient.Create(Application);

try

ICMP.OnStatus := Form1.ICMPStatus;

ICMP.OnReply := Form1.ICMPReply;

ICMP.Host := HostName;

ICMP.ReceiveTimeout := 500;

ICMP.port := 80;

ICMP.Ping;

Sleep(1);

Application.ProcessMessages;

Result := _PingOK;

except

result := false;

end;

finally

FreeAndNil(ICMP);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var I:0..100;

const

Host = ' OPSISG ' ;

begin

I:=0;

for I := ProgressBar7.Min to ProgressBar7.Max do

begin

ProgressBar7.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar7.Position := Progressbar7.Min;

end;

procedure TForm1.Button8Click(Sender: TObject);

var I:0..100;

const

Host = 'OPSISH ' ;

begin

I:=0;

for I := ProgressBar8.Min to ProgressBar8.Max do

begin

ProgressBar8.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar8.Position := Progressbar8.Min;

end;

procedure TForm1.Button2Click(Sender: TObject);

var I:0..100;

const

Host = 'OPSISF' ;

begin

I:=0;

for I := ProgressBar6.Min to ProgressBar6.Max do

begin

ProgressBar6.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar6.Position := Progressbar6.Min;

end;

procedure TForm1.Button3Click(Sender: TObject);

var I:0..100;

const

Host = 'OPSISE' ;

begin

I:=0;

for I := ProgressBar5.Min to ProgressBar5.Max do

begin

ProgressBar5.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar5.Position := Progressbar5.Min;

end;

procedure TForm1.Button5Click(Sender: TObject);

var I:0..100;

const

Host = 'OPSISC' ;

begin

I:=0;

for I := ProgressBar3.Min to ProgressBar3.Max do

begin

ProgressBar3.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar3.Position := Progressbar3.Min;

end;

procedure TForm1.Button6Click(Sender: TObject);

var I:0..100;

const

Host = 'OPSISB' ;

begin

I:=0;

for I := ProgressBar2.Min to ProgressBar2.Max do

begin

ProgressBar2.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar2.Position := Progressbar2.Min;

end;

procedure TForm1.Button7Click(Sender: TObject);

var I : 0..10;

const

Host = '10.162.4.101' ;

begin

I:=0;

for I := ProgressBar1.Min to ProgressBar1.Max do

begin

ProgressBar1.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar1.Position := Progressbar1.Min;

end;

procedure TForm1.Button4Click(Sender: TObject);

var I : 0..100;

const

Host = 'OPSISD' ;

begin

I:=0;

for I := ProgressBar4.Min to ProgressBar4.Max do

begin

ProgressBar4.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar4.Position := Progressbar4.Min;

end;

procedure TForm1.Button9Click(Sender: TObject);

var I : 0..100;

const

Host = 'SMTI' ;

begin

I:=0;

for I := ProgressBar9.Min to ProgressBar9.Max do

begin

ProgressBar9.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar9.Position := Progressbar9.Min;

end;

procedure TForm1.Button10Click(Sender: TObject);

var I:0..100;

const

Host = 'SMToffice' ;

begin

I:=0;

for I := ProgressBar10.Min to ProgressBar6.Max do

begin

ProgressBar10.Position := I;

Sleep(10);

end;

if Ping(Host) then

Statusbar1.Panels [2].Text := (host + ' Online')

else

Statusbar1.Panels [2].Text := (host + ' Offline');

ProgressBar10.Position := Progressbar10.Min;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Timer1.Enabled := false;

button7.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button6.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button5.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button4.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button3.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button2.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button1.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button8.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button9.Click;

Timer1.Enabled := true;

sleep(5000);

Timer1.Enabled := false;

button10.Click;

Timer1.Enabled := true;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

begin

Statusbar1.Panels [0].Text := ' '+datetostr(date);// para data

statusbar1.Panels [1].Text := ' '+timetostr(now)

end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0

o problema esta no proprio intervalo do Timer

o Timer ao ser acionado, fica valendo o intervalo de tempo que esta definido na propriedade interval

exemplo

Interval = 1000 // 1 segundo

então usando o seu codigo

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false; 
button7.Click;
Timer1.Enabled := true;
sleep(5000);
quando voce faz o click do botão, voce deve prever o tempo ideal para que o código que esta no botão seja executado antes que o proximo intervalo do timer seja executado experimente colocar um interval = 10000 // 10 segundos e elimine o sleep .... aumente o interval do timer até que o código do botão seja totalmente executado. Entretanto vale lembrar que a cada vez que o timer é habilitado o codigo inicial será sempre executado então faça essa mudança no timer
var
  Form1: TForm1;
  cc : integer = 0;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   inc(cc);
   case inc of
    1 : button1.Click;
    2 : button2.Click;
    3 : button3.Click;
    4 : button4.Click;
    5 : button5.Click;
    6 : button6.Click;
    7 : button7.Click;
    8 : button8.Click;
    9 : button9.Click;
    10: button10.Click;
    11: cc := 0;
   end;

end;

OBS: A cada intervalo do Timer, o contador será incrementado e um botão especifico será clicado

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

procure pelo erro no seu codigo

[Error] Unit1.pas(348): '(' expected but 'OF' found.

esperado um '(' e encontrado 'OF' .... deve estar na linha de comando da StatusBar

Statusbar1.Panels [2].Text := (host + ' Offline');

esta na linha 348 do seu código

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, uma ultima pergunta, estou tentando colocar uma linha de comando que vai colorir determinada panel, porém tenho que adiciona-lo na função do botão, para que quando o programa faça a verificação, além de apresentar a mensagen de Online ou Offline, ele ainda tinja o panel que vai estar na formula com vermelho se for Offline ou verde se for Online, tentei inserir, mas só consigo o tingimento Vermelho, quando tento insirir o verde na parte do Online ele na erro.

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

faça assim

if Ping(Host) then
   begin
      Statusbar1.Panels [2].Text := (host + ' Online');
      Panel1.Color := clGreen;
   end
else
   begin
       Statusbar1.Panels [2].Text := (host + ' Offline');
       Panel1.Color := clRed;
   end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Outra Duvida Pintando aqui :closedeyes: , Preciso fazer com que meu Software me envie um E-mail de Alerta sempre que o sistema estiver Offline, até ai tudo bem, mas para fazer isso terei que usar o ICMP? ou o IdPOP3? e como faço para ter uma logica basica para começar essa programação?

já deixa eu adicionar mais uma aqui tambem =), Jhonas, tambem preciso verificar se determinada Programa esta sendo executado na maquina remota, além do Ping quero fazer essa verificação, você saberia me orientar de como fazer isso pelo Delphi, Pois por Pront de Comando eu Consigo mas não sei colocalo no Delphi.

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, ainda não consegui pensar em como irei coloca-lo em meu Programa.

Devo criar uma função divendo que tal é o WinExec e depois adicionar um if then para criar o parametro

Ou Adiciono o coando WinExec dentro da linha de Ping e depois especifico que se ele for True ele devera marcar determinada Panel?

Grato.

Link para o comentário
Compartilhar em outros sites

  • 0

então basta testar o retorno do comando ... se for vazio o panel ficara vermelho

para pegar o retorno use

WinExec('cmd /c tasklist /S (IP) /U (Dominio/User) /P (Password) | FIND (Processo)' >c:\Ping.txt', 0);

é só verificar se o conteudo do arquivo ( Ping.txt ) está vazio

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz em um novo programinha para testar, porém ele so me retorna true, Você acha que eu vou ter que adicionar um Componente ICMP para fazer com que ele especifique o Status do comando DOS para verificação de True e false?

var Status : Integer;

Begin

Status := WinExec(Pchar('cmd /c tasklist /S 10.162.6.95 /U MES\mes_test /P mes_test | FIND "Takt.exe"'),SW_Hide);

WinExec (Pchar('cmd /c tasklist /S 10.162.6.95 /U MES\mes_test /P mes_test | ' +

'FIND "Takt.exe"'),SW_Hide);

if Status >= 0 then

begin

Statusbar1.Panels [2].Text := ('Program Running');

panel1.Color := clGreen;

panel2.Color := clBtnFace;

ProgressBar1.Position := Progressbar1.min;

end

else

begin

Statusbar1.Panels [2].Text := ('Program not Running');

panel1.Color := clBtnFace;

panel2.Color := clRed;

ProgressBar1.Position := Progressbar1.min;

end;

end;

end.

Link para o comentário
Compartilhar em outros sites

  • 0

Parece que voce não entendeu ... eu disse que era para voce testar o retorno do comando que é jogado no arquivo ping.txt

procedure TForm1.Button1Click(Sender: TObject);
var Arquivo: TextFile; Line: string;
begin
   WinExec(Pchar('cmd /c tasklist /S 10.162.6.95 /U MES\mes_test /P mes_test | FIND "Takt.exe" >c:\ping.txt'), 0);
   sleep(300);
   AssignFile(Arquivo, 'C:\ping.txt');
   Reset(Arquivo);
   while not EOF(Arquivo) do
   begin
      ReadLn(Arquivo, Line);
      if line <> '' then
      begin
         Statusbar1.Panels [2].Text := ('Program Running');
         panel1.Color := clGreen;
         panel2.Color := clBtnFace;
         ProgressBar1.Position := Progressbar1.min;
      end
      else
      begin
         Statusbar1.Panels [2].Text := ('Program not Running');
         panel1.Color := clBtnFace;
         panel2.Color := clRed;
         ProgressBar1.Position := Progressbar1.min;
      end;
   end;
   CloseFile(Arquivo);
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, Fiz examente como me instruiu e ele da erro, Debuguei e quando ele chega na linha

Reset(Arquivo);
Ele da o Seguinte erro

Project Project1.exe raised exception class EinOutError with message 'I/O error 32. Process stopped. Use Step or Run to Continue

Recebo a mesma mensagen de erro quando ele tenta executar a linha

CloseFile(Arquivo);

No Aguardo, Abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...