ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Como Saber Se Estou Conectado Na Internet Dando Ping

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Nelson_neto
Novato
Novato


Registrado: Quarta-Feira, 23 de Abril de 2008
Mensagens: 9

MensagemEnviada: Qua Abr 23, 2008 7:40 pm    Assunto: Como Saber Se Estou Conectado Na Internet Dando Ping Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
RobsonRibeiro
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 3 de Setembro de 2004
Mensagens: 192
Localização: São Paulo

MensagemEnviada: Qua Abr 23, 2008 9:52 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Qui Abr 24, 2008 1:14 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Qui Abr 24, 2008 1:15 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Nelson_neto
Novato
Novato


Registrado: Quarta-Feira, 23 de Abril de 2008
Mensagens: 9

MensagemEnviada: Sex Abr 25, 2008 10:05 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Sex Abr 25, 2008 8:27 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Nelson_neto
Novato
Novato


Registrado: Quarta-Feira, 23 de Abril de 2008
Mensagens: 9

MensagemEnviada: Dom Abr 27, 2008 9:22 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Abr 28, 2008 1:29 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Nelson_neto
Novato
Novato


Registrado: Quarta-Feira, 23 de Abril de 2008
Mensagens: 9

MensagemEnviada: Dom Mai 11, 2008 7:22 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB