Saltar al contenido

¿Cómo verificar si la conexión TcpClient está cerrada?

Recuerda que en la informática cualquier problema casi siempre tiene diferentes soluciones, por lo tanto nosotros te enseñamos lo más óptimo y eficiente.

Solución:

No le recomendaría que intente escribir solo para probar el zócalo. Y tampoco retransmita la propiedad Connected de .NET.

Si desea saber si el punto final remoto todavía está activo, puede usar TcpConnectionInformation:

TcpClient client = new TcpClient(host, port);

IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] tcpConnections = ipProperties.GetActiveTcpConnections().Where(x => x.LocalEndPoint.Equals(client.Client.LocalEndPoint) && x.RemoteEndPoint.Equals(client.Client.RemoteEndPoint)).ToArray();

if (tcpConnections != null && tcpConnections.Length > 0)

    TcpState stateOfConnection = tcpConnections.First().State;
    if (stateOfConnection == TcpState.Established)
    
        // Connection is OK
    
    else 
    
        // No active tcp Connection to hostName:port
    


client.Close();

Ver también:
TcpConnectionInformation en MSDN
Propiedades de IPGlobal en MSDN
Descripción de los estados de TcpState
Netstat en Wikipedia


Y aquí está como un método de extensión en TcpClient.

public static TcpState GetState(this TcpClient tcpClient)

  var foo = IPGlobalProperties.GetIPGlobalProperties()
    .GetActiveTcpConnections()
    .SingleOrDefault(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint));
  return foo != null ? foo.State : TcpState.Unknown;

Por lo que sé/recuerdo, no hay forma de probar si un enchufe está conectado además de leerlo o escribirlo.

No he usado TcpClient en absoluto, pero la clase Socket devolverá 0 de una llamada a Read si el extremo remoto se ha apagado correctamente. Si el extremo remoto no se apaga correctamente [I think] obtiene una excepción de tiempo de espera, no recuerdo el tipo, lo siento.

Usando código como ‘if(socket.Connected) socket.Write(...) crea una condición de carrera. Es mejor que simplemente llame a socket. Escriba y maneje las excepciones y/o desconexiones.

La solución de Peter Wone y Uriel es muy buena. Pero también debe verificar el punto final remoto, ya que puede tener varias conexiones abiertas con su punto final local.

    public static TcpState GetState(this TcpClient tcpClient)
    
        var foo = IPGlobalProperties.GetIPGlobalProperties()
          .GetActiveTcpConnections()
          .SingleOrDefault(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint)
                             && x.RemoteEndPoint.Equals(tcpClient.Client.RemoteEndPoint)
          );

        return foo != null ? foo.State : TcpState.Unknown;
    

Recuerda algo, que tienes la capacidad de agregar una reseña si diste con la contestación.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *