TcpClient.Connected retorna true ainda cliente não estiver conectado, o que eu posso usar em vez disso?

StackOverflow https://stackoverflow.com/questions/101708

  •  01-07-2019
  •  | 
  •  

Pergunta

Em VB.net Eu estou usando o TcpClient para recuperar uma seqüência de dados. Eu estou constantemente verificando a propriedade .Connected para verificar se o cliente está conectado, mas mesmo se o cliente desconecta isso ainda retorna true. O que posso usar como uma solução para isso?

Esta é uma versão simplificada do meu código atual:

Dim client as TcpClient = Nothing
client = listener.AcceptTcpClient
do while client.connected = true
   dim stream as networkStream = client.GetStream()
   dim bytes(1024) as byte
   dim numCharRead as integer = stream.Read(bytes,0,bytes.length)
   dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i)
loop

Eu teria imaginado pelo menos a chamada GetStream () iria lançar uma exceção se o cliente foi desligado, mas eu fechei o outro aplicativo e ainda não ...

Graças.

Editar Polling o Client.Available foi sugerido, mas que não resolve a questão. Se o cliente não é 'efectivamente' conectado disponíveis apenas retorna 0.

A chave é que eu estou tentando permitir a conexão para permanecer aberto e permita-me para receber dados várias vezes sobre a mesma conexão socket.

Foi útil?

Solução

Quando NetworkStream.Read retorna 0, a conexão foi fechada. Referência :

Se não há dados disponíveis para leitura, o método NetworkStream.Read irá bloquear até que os dados estão disponíveis. Para evitar o bloqueio, você pode usar a propriedade DataAvailable para determinar se os dados são enfileirados no buffer de rede de entrada para a leitura. Se DataAvailable retorna true, a operação de leitura será concluída imediatamente. A operação de leitura vai ler o máximo de dados está disponível, até o número de bytes especificado pelo parâmetro tamanho. Se os fecha host remoto para baixo a conexão, e todos os dados disponíveis foi recebida, o método de leitura será concluída imediatamente e retornar zero bytes.

Outras dicas

Melhor resposta:

  if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];
                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }

https://i.stack.imgur.com/Jb0X2.png

link = https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0

Você precisa configurar um temporizador que envia uma mensagem para o outro tomada ao longo do tempo.

Dim TC As New TimerCallback (AddressOf Ping)

Tick = New Threading.Timer (TC, Nada, 0, 30000)

Sub Ping()
    Send("Stil here?")
End Sub

Em vez de polling client.connected, talvez usar uma das propriedades do NetworkStream para ver se não há mais dados disponíveis?

De qualquer forma, há um ONDotnet.com artigo com toneladas de informações sobre os ouvintes e outros enfeites. Deve ajudá-lo a superar o seu problema ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top