Página 1 de 1
Verificar conexão com Socket
Enviado: 22 Jun 2011 08:33
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.
Verificar conexão com Socket
Enviado: 22 Jun 2011 09:18
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
Verificar conexão com Socket
Enviado: 22 Jun 2011 09:32
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
Verificar conexão com Socket
Enviado: 22 Jun 2011 11:15
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.
Verificar conexão com Socket
Enviado: 22 Jun 2011 13:02
por Jairo Maia
Olá Leonardo,
Vc tentou usar INetDataReady(Socket)? Parece que retorna -1 se a conexão falhar.
Verificar conexão com Socket
Enviado: 22 Jun 2011 15:25
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.
Verificar conexão com Socket
Enviado: 22 Jun 2011 15:39
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
Verificar conexão com Socket
Enviado: 22 Jun 2011 15:40
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
Verificar conexão com Socket
Enviado: 22 Jun 2011 16:07
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.
Verificar conexão com Socket
Enviado: 22 Jun 2011 17:00
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.
Verificar conexão com Socket
Enviado: 22 Jun 2011 17:02
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
Verificar conexão com Socket
Enviado: 22 Jun 2011 17:04
por Maligno
Pensei que fosse internet. Minha sugestão seguinte seria exatamente o PING.

Já que deu certo, maravilha.