TcpClient.Conectado devuelve true sin embargo, el cliente no está conectado, ¿qué puedo usar en su lugar?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

En VB.net estoy usando el TcpClient para recuperar una cadena de datos.Estoy revisando constantemente el .Conectado a la propiedad para comprobar si el cliente está conectado, pero incluso si el cliente se desconecta esta todavía devuelve true.¿Para qué puedo usar como una solución para esto?

Esta es una versión reducida de mi actual código:

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

Yo habría descubierto al menos el GetStream() la llamada podría lanzar una excepción si el cliente se desconecta, pero me he cerrado la otra aplicación, y aún no...

Gracias.

EDITAR El sondeo de el Cliente.Disponible fue sugerido, pero que no soluciona el problema.Si el cliente no es 'en realidad' conectadas disponibles sólo devuelve 0.

La clave es que estoy tratando de permitir la conexión a permanecer abiertos y me permiten recibir datos varias veces sobre la misma conexión de socket.

¿Fue útil?

Solución

Cuando NetworkStream.Read devuelve 0, entonces la conexión se ha cerrado. Referencia:

Si no se dispone de datos para la lectura, la NetworkStream.Método de lectura se bloqueará hasta que se disponga de datos.Para evitar el bloqueo, puedes usar el DataAvailable de la propiedad para determinar si los datos se ponen en cola en el entrante de la red de búfer para la lectura.Si DataAvailable devuelve true, la operación de Lectura se completa inmediatamente.La operación de Lectura leer la mayor cantidad de datos disponibles, el número de bytes especificado por el parámetro de tamaño. Si el host remoto se cierra la conexión, y todos los datos disponibles ha sido recibido, el método de Lectura se completa inmediatamente y devolver cero bytes.

Otros consejos

Mejor respuesta:

  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

Usted necesita establecer un temporizador que envía un msj a la otra zócalo de vez en cuando.

Dim TC Como Nuevo TimerCallback(AddressOf Ping)

Tick = New Roscado.Temporizador(TC, Nada, 0, 30000)

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

En lugar de la votación del cliente.conectado, tal vez el uso de la NetworkStream propiedades para ver si no hay más datos disponibles?

De todos modos, hay un ONDotnet.com artículo con TONELADAS de información sobre los oyentes y otras cosas.Debe ayudarle a superar su problema...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top