Verificar conexão com Socket

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Verificar conexão com Socket

Mensagem por sygecom »

Bom dia Pessoal,
Como faço para saber se uma conexão com o Socket ainda está ativa ?

Tentei usando INETSTATUS() porem conectado ou desconectado ele sempre retorna(1) conexão ativa.

Se alguém tiver alguma dica agradeço.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar conexão com Socket

Mensagem por asimoes »

Leonardo,

Achei este código, não testei.

Código: Selecionar todos

 if inetinit()
        ? m->pSocket := iNetConnect( 'www.google.com', 80 )
        IF INetErrorCode( m->pSocket ) <> 0
            ? "Socket error:", INetErrorDesc( m->pSocket )
            ? 'cleanup', INetCleanUp()
            QUIT
        ENDIF
        ?'status ', INETSTATUS( m->pSocket )
        ? if(  INetClose( m->pSocket ) == 0, ' INTERNET OK!', ' NO INTERNET!
' )
        ?'cleanup ',inetcleanup()
    endif 
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar conexão com Socket

Mensagem por asimoes »

Tem esse teste aqui:

Código: Selecionar todos

/*****************************************************
* Check to see if you can connect to a Url
* Also it could be used to determine if internet access is available
* ( Based on test code found into C:\HARBOUR\contrib\hbtip\tests\ )
* Pete D.: 17/07/2010
*/

#include "hbclass.ch"
#include "tip.ch"

PROCEDURE MAIN( cUrl )

LOCAL lIsInternet

cUrl :=  IIF(Empty(cUrl), 'http://www.google.com', cUrl)

Set Color to w+/b

CLEAR SCREEN

lIsInternet := ConnectTo( cUrl ) // q.: and what if google.com goes
down? 8-)

? "Internet available: " + HB_ValToExp( lIsInternet )

wait

Return

**************************
Function ConnectTo( cUrl )
**************************
LOCAL oUrl, oClient, cData, cMess
Local lRet := .f.
Begin Sequence

   IF Empty( cUrl )
      Break
   ENDIF

   oUrl := tURL():New( cUrl )
   IF Empty( oUrl )
      Alert( "Invalid url " + cUrl )
      Break
   ENDIF
   oClient := TIpClientHttp():new( oUrl )
   IF Empty( oClient )
      Alert( "Invalid url " + cUrl )
      Break
   ENDIF
   oClient:nConnTimeout := 2000 // Here!
   IF oClient:Open()
      IF Empty( oClient:cReply )
        cData := oClient:Read()
        IF ! Empty( cData )
           cMess := "Connection status: <connected> & <reading ok!>"
           lRet := .T.
        ELSE
           cMess := "Connection status: <Not connected>/<Not able to read>
(Check line/cables/netcards/firewalls et.c.)"
        ENDIF

         Alert( "Connection last responce:" +
HB_ValToExp(oClient:lastErrorMessage()) + HB_OSNewline() + cMess )

      ELSE
         Alert( "Connection status: " + oClient:cReply )
      ENDIF
      oClient:Close()

   ELSE
      Alert( "Can't open URL " + cUrl + ;
             IIF( ! Empty( oClient:cReply ), HB_OSNewLine() +
oClient:cReply, '' ) )
   ENDIF

End Sequence

RETURN lRet 
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Verificar conexão com Socket

Mensagem por sygecom »

Obrigado pelos exemplos Asimoes. O primeiro eu já havia tentado, acontece que ele demora muita para testar e se diminuo o timeout ele me devolve uma resposta errada.
Vou testar o segundo, de momento muito obrigado.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Verificar conexão com Socket

Mensagem por Jairo Maia »

Olá Leonardo,

Vc tentou usar INetDataReady(Socket)? Parece que retorna -1 se a conexão falhar.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Verificar conexão com Socket

Mensagem por sygecom »

Olá Asimoes,
Apenas para lhe avisar que não deu certo sua segunda rotina, ela serve apenas para link que HTTP, e no meu caso é uma conexão com um dispositivo que não tem protocolo http apenas TCP/IP.

Olá Jairo,
Eu testei agora com essa função e quando desligo o cabo da rede ele continua me retornando ZERO que não tem nada para receber, em vez de gerar um valor NEGATIVO de erro, meu problema que tenho que saber se ainda está conectado antes de receber ou enviar alguma informação, é um dispositivo que ficara conectado o dia todo, e caso cair a conexão tenho que reconectar imediatamente.

Se alguém mais tiver alguma dica agradeço.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar conexão com Socket

Mensagem por asimoes »

Leonardo,

Você poderia usar até o netio para isso, mas teria que ter o server rodando em todas as máquinas ou na máquina que você quer testar a conexão:

Pensei neste exemplo do netio que testa a conexão com o servidor, talvez uma adaptação resolva.

Esse ip que você testa é de uma rede interna ou externa (internet)?

#define DBSERVER "127.0.0.1"
#define DBPORT 2941
#define DBPASSWD "topsecret"
pSockSrv := netio_mtserver( DBPORT,,, /* RPC */ .T., DBPASSWD )
if empty( pSockSrv )
? "Cannot start NETIO server !!!"
wait "Press any key to exit..."
quit
endif
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Verificar conexão com Socket

Mensagem por asimoes »

Leonardo,

Você poderia usar até o netio para isso, mas teria que ter o server rodando em todas as máquinas ou na máquina que você quer testar a conexão:

Pensei neste exemplo do netio que testa a conexão com o servidor, talvez uma adaptação resolva.

Esse ip que você testa é de uma rede interna ou externa (internet)?

Código: Selecionar todos

  
   #define DBSERVER  "127.0.0.1"
   #define DBPORT    2941
   #define DBPASSWD  "topsecret"
   pSockSrv := netio_mtserver( DBPORT,,, /* RPC */ .T., DBPASSWD )
   if empty( pSockSrv )
      ? "Cannot start NETIO server !!!"
      wait "Press any key to exit..."
      quit
   endif
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Verificar conexão com Socket

Mensagem por Maligno »

Se pesquisar na internet a respeito, verá que a maior parte das respostas converge para o mesmo ponto: não há um modo realmente infalível (e ptrático) de verificar se a conexão com a internet está ou não ativa, para todas as situações possíveis. A forma mais segura, a meu ver, é verificar se existe conexão com algum site cuja disponibilidade esteja perto dos 100% na maior parte do tempo. É o caso do Google, conforme utilizado pelo colega na segunda mensagem desta thread.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Verificar conexão com Socket

Mensagem por sygecom »

Olá asimoes,
Infelizmente não tem como usar NETIO, por que tenho que usar SQLRDD em conjunto, mas assim mesmo agradeço a dica.

Maligno,
Não quero saber se tem internet ou não, quero saber se um determinado DISPOSITIVO(TCP/IP) está conectado ou não no Socket.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Verificar conexão com Socket

Mensagem por sygecom »

Obrigado Pessoal,
Consegui usando o PING do exemplo do Vailton, muito bom por sinal...

filebase.php?d=1&id=149&c_old=0&what=c&page=1
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Verificar conexão com Socket

Mensagem por Maligno »

Pensei que fosse internet. Minha sugestão seguinte seria exatamente o PING. :) Já que deu certo, maravilha.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder