TCPCLIENT RESETAR CONEXÃO

FERDEAD 25/10/2017 16:49:43
#477401
Olá!

estou fazendo a conexão com outro aplicativo via TCP, onde eu consigo conectar com o TCPCLIENT do VB.NET tudo blz..

só que se por algum motivo, o outro programa fechar ou der problema na rede, eu não consigo mais a reconexão sozinha.. tenho que fechar o programa e abrir novamente..

como é feito para que quando detectar que caiu a conexão, ele fechar e ficar tentando uma nova conexão automaticamente ?
KERPLUNK 25/10/2017 22:07:05
#477412
Você está fechando a stream antes de fechar a conexão?

tcpClient.Stream.Close();
tcpClient.Close();


O ideal mesmo seria usar blocos [Ô]using[Ô]
FERDEAD 27/10/2017 17:36:50
#477491
Citação:

:
Você está fechando a stream antes de fechar a conexão?


tcpClient.Stream.Close();
tcpClient.Close();


O ideal mesmo seria usar blocos [Ô]using[Ô]


Então, eu consigo fechar a conexão e reconectar, mas com o código...

Se cair o programa do lado do servidor, ou der problema na rede, o código que eu uso não funciona..

O Código que achei tá assim:
  

Try
dim sck as new tcpclient
sck.Connect(IP, PORTA)
NetStream = sck.GetStream()

Dim OutStream As Byte() = Encoding.ASCII.GetBytes(Comando & [Ô]|-FIM-[Ô])

Dim inStream(100000) As Byte


NetStream.Write(OutStream, 0, OutStream.Length)
NetStream.Flush()

NetStream.Read(inStream, 0, CInt(sck.ReceiveBufferSize))
ReceivedData = Encoding.ASCII.GetString(inStream)
HandleReceivedDate(ReceivedData)

ReceivedData = ReceivedData.Substring(0, InStr(ReceivedData, [Ô]-FIM-[Ô]) - 1)

sck.Close()

Catch ex As SocketException
If vlErro = False Then
[ô]sck.Client.Disconnect(False)
sck.Close()
sck = New TcpClient
vlErro = True
GoTo Recomecar
Else
Return ex.Message
End If
Catch ex As Exception
Return [Ô]Erro de comunicação com o Gerenciador[Ô] & vbNewLine & vbNewLine & ex.Message


End Try

Return ReceivedData


Desse jeito, eu fiz para conectar no servidor, realizar a comunicação e fechar a conexão.. Dessa maneira tá indo, mas eu queria manter a conexão sempre ativa.. e quando cair, ele ficar tentando reconectar sozinho..
KERPLUNK 27/10/2017 17:46:24
#477492
Se cair a conexão do lado do server, então a stream tem que ser fechada do lado do server ou derrubada por algum nó no meio, você não tem controle sobre isso quando essa situação acontecer.
FERDEAD 30/10/2017 12:54:01
#477512
Então.. com o winsock que usava no vb6, eu tinha a propriedade state.. ai, quando ela era diferente de conectado, eu resetava a conexão.. funcionava certinho..
KERPLUNK 30/10/2017 13:08:50
#477513
Resetar o socket é uma coisa, resetar o client é outra...
DS2T 31/10/2017 09:17:18
#477529
Olá!

O protocolo TCP/IP por si só, não gerencia os estados da conexão. Pode levar até 2 horas para identificar a queda de conexão, e geralmente é quando você tenta enviar alguma coisa e recebe um Exception na cara.

Então eu recomendo:

Gerencie as exceptions de envio e recebimento.

Mas aí entra a pergunta [Ô]Ah, mas se eu não enviar ou receber nada, eu não vou descobrir que a conexão foi perdida[Ô].
Aí entra uma técnica que o pessoal costuma chamar de [Ô]heartbeat[Ô], que nada mais é do que identificar o estado ocioso de comunicação através de um timer e se ele tiver [Ô]n[Ô] segundos/minutos (isso depende da criticidade da sua operação) sem receber ou enviar nada, você força o envio de um byte ou pacote de bytes. Implemente isso tanto no lado do cliente quanto do servidor, e você terá uma operação mais segura.

Abraços!
Tópico encerrado , respostas não são mais permitidas