Como verificar se um servidor está online?
19/03/2006
0
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
Tiks
Posts
20/03/2006
Aroldo Zanela
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.
20/03/2006
Tiks
21/03/2006
Kroki
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...
21/03/2006
Massuda
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.
22/03/2006
Kroki
22/03/2006
Tiks
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.
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!
22/03/2006
Kroki
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...
22/03/2006
Tiks
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!
22/03/2006
Tiks
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!
22/03/2006
Kroki
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...
22/03/2006
Tiks
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!!!!!!!
=D
23/03/2006
Kroki
Clique aqui para fazer login e interagir na Comunidade :)