Array
(
)

Como verificar se um servidor está online?

Tiks
   - 19 mar 2006

Olá,

Sou novo no forum e também não tenho muita experiência em programação, pode-se dizer que sou um auto didata :) e estou me saindo até que bem (desde que achei esse forum as coisas ficaram mais faceis) eu sempre uso a opção Pesquisar e sempre acho o que procuro, porém desta vez por mais que tenha procurado, não achei.
Por isso venho pedir, fazendo um enorme favor, a ajuda de vocês.

Eu tenho uma aplicação que tem como única utilidade verificar se um servidor está online. Eu venho usando o componente da Paleta Indy, o TIdIdent, quando o servidor está online eu não tenho problemas nenhum, porém quando o servidor está offline, a aplicação ´´Freeza´´ por quase 20s enquanto espera o ´Timeout´, para contornar o ´Freeze´ eu criei um Thread, apesar de alguns erros no Thread, ele não me sirviu para muita coisa, porque mesmo com o Thread eu não consigo interromper a tentativa de conexão.
Depois de muito escrever (e tomar o tempo dos colegas explicando a situação) eu gostaria de saber se vocês conhecem algum jeito de se colocar um Timeout menor ou então cancelar o processo de conexão, ou mesmo a sugestão de outro componente, eu peço desculpas se esta questão é muito simples, eu realmente não sei.

Obrigado desde já pela ajuda,
Tiks


Aroldo Zanela
   - 20 mar 2006


Citação:
Olá,

Sou novo no forum e também não tenho muita experiência em programação, pode-se dizer que sou um auto didata :) e estou me saindo até que bem (desde que achei esse forum as coisas ficaram mais faceis) eu sempre uso a opção Pesquisar e sempre acho o que procuro, porém desta vez por mais que tenha procurado, não achei.
Por isso venho pedir, fazendo um enorme favor, a ajuda de vocês.

Eu tenho uma aplicação que tem como única utilidade verificar se um servidor está online. Eu venho usando o componente da Paleta Indy, o TIdIdent, quando o servidor está online eu não tenho problemas nenhum, porém quando o servidor está offline, a aplicação ´´Freeza´´ por quase 20s enquanto espera o ´Timeout´, para contornar o ´Freeze´ eu criei um Thread, apesar de alguns erros no Thread, ele não me sirviu para muita coisa, porque mesmo com o Thread eu não consigo interromper a tentativa de conexão.
Depois de muito escrever (e tomar o tempo dos colegas explicando a situação) eu gostaria de saber se vocês conhecem algum jeito de se colocar um Timeout menor ou então cancelar o processo de conexão, ou mesmo a sugestão de outro componente, eu peço desculpas se esta questão é muito simples, eu realmente não sei.

Obrigado desde já pela ajuda,
Tiks

Colega,

Eu sugiro fazer apenas um teste de ´Ping´. A Indy possui esse mecanismo, porém, ele é lento e você consegue algoritmos mais eficientes na WEB.


Tiks
   - 20 mar 2006

Se possivel você poderia me recomendar um, de preferencia freeware ou então algum site de componentes... muitissimo obrigado !!


Kroki
   - 21 mar 2006

Ve se isso e ajuda,utilizando Yndy(IdlCmpClient)
pintx:Boolean;//se 0 servidor não respondeu

procedure TForm1.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
var
s:integer;
begin
s:=ReplyStatus.BytesReceived;
if s=0 then pingtx:=false else pingtx:=true;
end;
procedure TForm1.ping;
var
i: integer;
begin
IdIcmpClient1.OnReply:= ICMPReply;
IdIcmpClient1.ReceiveTimeout :=300;
IdIcmpClient1.Host :=ip;//IP do servidor
IdIcmpClient1.Ping;
Application.ProcessMessages;
end;

Use assim;
...
IP:=192.168.254.001//servidor qualquer
ping;
if pingtx=true then begin...


Massuda
   - 21 mar 2006

No caso do servidor estar offline, independente do método que você usar para ´pingar´ o servidor, o tempo que leva até desistir de receber uma resposta é determinado pelo Windows e sempre é um tempo ´grande´. É feito dessa maneira porque o Windows não sabe se o destino é uma máquina na rede local ou na China; o tempo ´grande´ também é adotado porque o tráfego na rede pode atrasar a resposta ao ping. A idéia do tempo ´grande´ é evitar dar um resultado falso (servidor offline mas na verdade está online).

Nenhum componente irá funcionar sem o travamento no caso do servidor estar offline. Se você mudar a configuração do Windows, há risco de outras coisas (como a navegação na internet) pararem de funcionar.

O que você pode fazer é codificar de modo a não ficar preso esperando o resultado do ping.


Kroki
   - 22 mar 2006

Uso esse sistema numa rede de 25 pcs,só trava se a rede nao estiver ativa e vc só deve tentar conectar a algo se vc não conseguir ´pingar´...


Tiks
   - 22 mar 2006


Citação:
Ve se isso e ajuda,utilizando Yndy(IdlCmpClient)
pintx:Boolean;//se 0 servidor não respondeu

procedure TForm1.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);

(...)

Na parte que ele chama a resposta eu não consegui compilar, porém eu acho que terá o mesmo problema do outro como o Massuda falou, o timeout.


Citação:
O que você pode fazer é codificar de modo a não ficar preso esperando o resultado do ping.


Para isso eu fiz um thread, porém, teria como eu cancelar a ´tentativa´ de conexão, por ex depois de 3s, eu tentei mas ele continua tentando conectar!

Eu ja vi esse ´checadores´ em php, o unico problema dele aqui seria o timeout... Desculpe se estou ´travando´ em algo muito simples, mas teria como abortar a ultima tentativa de conexão?

obrigado
Tiks!


Kroki
   - 22 mar 2006

Qual o erro que deu?
A idéia é simples,nada pode travar se vc não mandar nada para um Pc off-line,se estiver off-line(no caso do ping ele espera 300 mils)depois de 300 mils vc tem true ou false,foi assim que resolví o problema de travamento de um programa de LanHouse quando reiniciavam o Pc sem o operador saber...


Tiks
   - 22 mar 2006

Não achei o botão editar, srry

Citação:
Uso esse sistema numa rede de 25 pcs,só trava se a rede nao estiver ativa e vc só deve tentar conectar a algo se vc não conseguir ´pingar´...


Assim kroki, eu estou utilizando isso para testar se um servidor está online ou não, quando está online, funciona tudo certinho, porém quando está off, ele freeza (já contornei isso com um thread), o que eu gostaria é parar esta tentativa de conexão, ou então dar um tempo limite menor (timeout), por ex no windows:
ping <ip> -w tmpo_limite

algo assim,
obrigado pela ajuda
Tiks!


Tiks
   - 22 mar 2006

Desculpem denovo mas não tem o botão editar aqui!

Citação:
Qual o erro que deu?
A idéia é simples,nada pode travar se vc não mandar nada para um Pc off-line,se estiver off-line(no caso do ping ele espera 300 mils)depois de 300 mils vc tem true ou false,foi assim que resolví o problema de travamento de um programa de LanHouse quando reiniciavam o Pc sem o operador saber...


Eu modifiquei um pouco e funcionou, porém ele possui o mesmo problema do outro componente que estava usando, possui timeout próprio, esse receiveTimeout não funciona, experimentei colocar um Host que não existe, e só depois de algum tempo, muito mais que 300 ms ele retornou Socket Error: Host not found.

o problema continua

O problema não é nem freezar, porém é o tempo que ele demora para retornar a mensagem,

Se alguem tiver alguma outra idéia é bem vinda :D

obrigado
Tiks!


Kroki
   - 22 mar 2006

Uso assim(teste com um Button);

type
TForm1 = class(TForm)
Button1: TButton;
IdIcmpClient1: TIdIcmpClient;
procedure ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
procedure ping;
procedure Button1Click(Sender: TObject);
...

var
Form1: TForm1;
Respondeu:Boolean;
implementation

{$R *.dfm}
procedure TForm1.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);
var
s:integer;
begin
s:=ReplyStatus.BytesReceived;
if s=0 then Respondeu:=false else Respondeu:=true;
end;
procedure TForm1.ping;
begin
IdIcmpClient1.OnReply:= ICMPReply;
IdIcmpClient1.ReceiveTimeout :=300;//usei 300 para Lan com 20 Pcs
IdIcmpClient1.Host :=´192.168.254.254´;//´127.0.0.1´;//IP do servidor
IdIcmpClient1.Ping;
Application.ProcessMessages;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
try
ping;
except begin
ShowMessage(´Não Conectado!´);
exit;
end;
end;
if Respondeu=true then ShowMessage(´Conectado!´)else ShowMessage(´Não Conectado!´);
end;

end.

Pode testar inventando um IP fantasma e depois com IP local(127.0.0.1),nada de travamentos...


Tiks
   - 22 mar 2006

Kroki, você resolveu um problema de dias meus!!!!!!
Eu não sei porque, comigo escrevendo ele não funcionava, mas agora está perfeito!!!!!!!!!!

Muito obrigado! Funciona, o timeout definidio funciona certinho! Muito Obrigado Mesmo!!!!!!!

Kroki
   - 23 mar 2006

Fiz questão de ajudar porque na época pastei muito com isso...