Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
Nelson_neto Novato
Registrado: Quarta-Feira, 23 de Abril de 2008 Mensagens: 9
|
Enviada: Qua Abr 23, 2008 7:40 pm Assunto: Como Saber Se Estou Conectado Na Internet Dando Ping |
|
|
Olá...
Estou a criar um programa em Delphi7 onde perciso de saber se o usuario esta conectado a Internet.Já procurei varias funções, mas nenhuma deu certo.
Agora estou a usar o componente da Paleta Indy Clients IdIcmpClient, penso que com este haja uma maneira de saber se estou ou não conectado à Internet.
Estou a usar o seguinte codigo no evento onclick do button, mas devo de estar a fazer algo errado, porque quando estou conectado à internet funciona bem mas se não tiver conectado dá um erro o (SOCKET ERRO # 11001 Host not found).
O codigo que estou a utilizar é:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdIcmpClient1.Host := ('www.google.pt');
IdIcmpClient1.ReceiveTimeout := 500;
try
IdIcmpClient1.Ping;
ShowMessage('Internet conectada');
except
ShowMessage('Internet desconectada');
end;
end;
Gostava que me ajudassem a resolver este problema e que me digam onde estou a errar, ficou a espera se sugestões.
Obrigado |
|
Voltar ao Topo |
|
|
RobsonRibeiro Aprendiz
Registrado: Sexta-Feira, 3 de Setembro de 2004 Mensagens: 192 Localização: São Paulo
|
Enviada: Qua Abr 23, 2008 9:52 pm Assunto: |
|
|
Tenta o seguinte código:
Código: |
procedure TForm1.btnConectarClick(Sender: TObject);
var i:integer;
s, s2, s3: string;
begin
IdIcmp.Host := edtHost.Text ;
IdIcmp.ReceiveTimeout := StrToInt(edtTimeOut.Text);
try
s2 := '';
s3 := '';
IdIcmp.Ping;
if IdIcmp.ReplyStatus.FromIpAddress = '0.0.0.0' then
begin
s2 := ' Host: '+Listip.Items.Strings[i] +
' Bytes Rec: '+IntToStr(IdIcmp.ReplyStatus.BytesReceived)+
' TTL: '+IntToStr(IdIcmp.ReplyStatus.TimeToLive);
end
else
begin
s2 := ' Host: '+IdIcmp.ReplyStatus.FromIpAddress +
' Bytes Rec: '+IntToStr(IdIcmp.ReplyStatus.BytesReceived)+
' TTL: '+IntToStr(IdIcmp.ReplyStatus.TimeToLive);
end;
case IdIcmp.ReplyStatus.ReplyStatusType of
rsEcho : s3:= ' Respondeu';
rsError : s3:= ' Erro';
rsTimeOut : s3:= ' TimeOut';
rsErrorUnreachable : s3:= ' Não Encontrado';
rsErrorTTLExceeded : s3:= ' TTL Excedido';
end;
s := s + s2 + s3 + #13#10;
except on E:exception do
s := s + 'Não Achou o Host: '+Listip.Items.Strings[i] + ' ' + e.Message + #13#10;
end;
end;
|
onde o IDIcmp é o componente TIdIcmpClient.
Espero que ajude,
Robson Ribeiro. |
|
Voltar ao Topo |
|
|
gilsonnrodrigues Moderador
Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Qui Abr 24, 2008 1:14 pm Assunto: |
|
|
vc faz questao de ser com ping?
pq um ping falhar não significa q vc nao esteja necessariamente desconectado da net!
pode ser q pra quem vc pingou não respondeu.
vc poderia usar o InternetGetConnectedState
procure no help ou aki no forum mesmo ja foi falado sobre essa API |
|
Voltar ao Topo |
|
|
gilsonnrodrigues Moderador
Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Qui Abr 24, 2008 1:15 pm Assunto: |
|
|
Código: |
if not InternetGetConnectedState(@Flags, 0) then
ShowMessage('Você não está conectado à Internet')
else if Flags and INTERNET_CONNECTION_LAN <> 0 then
ShowMessage('Você está conectado à Internet através de um roteador')
else if Flags and INTERNET_CONNECTION_PROXY <> 0 then
ShowMessage('Você está conectado à Internet através de um proxy')
else
ShowMessage('Você está conectado à Internet') |
|
|
Voltar ao Topo |
|
|
Nelson_neto Novato
Registrado: Quarta-Feira, 23 de Abril de 2008 Mensagens: 9
|
Enviada: Sex Abr 25, 2008 10:05 am Assunto: |
|
|
gilsonnrodrigues escreveu: | vc faz questao de ser com ping?
pq um ping falhar não significa q vc nao esteja necessariamente desconectado da net!
pode ser q pra quem vc pingou não respondeu.
vc poderia usar o InternetGetConnectedState
procure no help ou aki no forum mesmo ja foi falado sobre essa API |
Não é necessário ser com Ping, mas a minha ideai era mandar um Ping para um site tipo www.google.pt , para este é muito difícil o ping falhar.
Já usei o InternetGetConnectedState mas não deu certo, porque tenho o router ligado á placa de rede e quando desligo a net vou fazer o teste e continua a dar a mensagem (Você está conectado à Internet através de um roteador) o que é falso porque eu desliguei a Internet, só que ele da essa mensagem porque o cabo de rede continua ligado ao router.
Tem maneira de resolver isto?? |
|
Voltar ao Topo |
|
|
gilsonnrodrigues Moderador
Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Sex Abr 25, 2008 8:27 pm Assunto: |
|
|
ai teria q ser ping ou fazer uma conexao com socket na porta HTTP, só pra ver se aceita a conexao.
ou seja, vc não transmitiria dado algum. só conecta e desconecta o socket.
caso consiga é q ta conectado. ai vc implementa um timeout. |
|
Voltar ao Topo |
|
|
Nelson_neto Novato
Registrado: Quarta-Feira, 23 de Abril de 2008 Mensagens: 9
|
Enviada: Dom Abr 27, 2008 9:22 pm Assunto: |
|
|
gilsonnrodrigues escreveu: | ai teria q ser ping ou fazer uma conexao com socket na porta HTTP, só pra ver se aceita a conexao.
ou seja, vc não transmitiria dado algum. só conecta e desconecta o socket.
caso consiga é q ta conectado. ai vc implementa um timeout. |
Se não fosse pedir muito gostava que me indicasse um codigo para eu ter uma ideia de como é ele feito, porque é a primeira vez que estou a trabalhar com socket. |
|
Voltar ao Topo |
|
|
gilsonnrodrigues Moderador
Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Abr 28, 2008 1:29 pm Assunto: |
|
|
fiz um exemplo simples aki!!
essa unit é só copiar, colar e salvar.
Código: | unit uSocketPing;
interface
uses
Windows, SysUtils, Forms, ScktComp;
function Ping(TimeOut : Cardinal; cHost : string; Porta : Word) : Integer;
implementation
type
TSocketPing = class(TClientSocket)
private
FErro : Integer;
protected
procedure Error(Socket : TCustomWinSocket; ErrorEvent : TErrorEvent;
var ErrorCode : Integer); override;
end;
{ TSocketPing }
procedure TSocketPing.Error(Socket : TCustomWinSocket;
ErrorEvent : TErrorEvent; var ErrorCode : Integer);
begin
FErro := ErrorCode;
if FErro = 0 then
FErro := 1;
Close;
ErrorCode := 0;
inherited;
end;
function Ping(TimeOut : Cardinal; cHost : string; Porta : Word) : Integer;
var
vTick : Cardinal;
begin
if cHost = '' then
raise Exception.Create('Host inválido');
if Porta = 0 then
raise Exception.Create('Porta inválida');
with TSocketPing.Create(Application) do
try
Close;
if cHost[1] in ['0'..'9'] then
Address := cHost
else
Host := cHost;
Port := Porta;
FErro := 0;
Open;
//Por ser conexão assíncrona
vTick := GetTickCount + TimeOut;
while True do
begin
if Application.Terminated then
Abort;
if vTick < GetTickCount then
FErro := 10;
if Socket.Connected or (FErro <> 0) then
Break;
Application.ProcessMessages;
end;
if Active then
Result := 0
else
begin
Result := FErro;
if Result = 0 then
Result := 1;
end;
Close;
finally
Free;
end;
end;
end. |
exemplo de uso:
Código: | procedure TForm1.Button1Click(Sender: TObject);
var
R : Integer;
begin
R := uSocketPing.Ping(10000, 'www.uol.com.br', 80);
if R = 0 then
ShowMessage('Conectado à internet')
else
ShowMessage('Não conectado à internet - Erro: '+IntToStr(R));
end; |
teste ai e qq coisa poste o resultado. |
|
Voltar ao Topo |
|
|
Nelson_neto Novato
Registrado: Quarta-Feira, 23 de Abril de 2008 Mensagens: 9
|
Enviada: Dom Mai 11, 2008 7:22 pm Assunto: |
|
|
Desculpem ter demorado muito tempo a responder.
Obrigado gilsonnrodrigues a sua dica ajudou-me a resolver a minha duvida, mais uma vez obrigado a todos os que se mostraram interessados em me ajudar. |
|
Voltar ao Topo |
|
|
|