Search code examples
c#socketstcpclientnetworkstream

How to check if TcpClient Connection is closed?


I'm playing around with the TcpClient and I'm trying to figure out how to make the Connected property say false when a connection is dropped.

I tried doing

NetworkStream ns = client.GetStream();
ns.Write(new byte[1], 0, 0);

But it still will not show me if the TcpClient is disconnected. How would you go about this using a TcpClient?


Solution

  • I wouldn't recommend you to try write just for testing the socket. And don't relay on .NET's Connected property either.

    If you want to know if the remote end point is still active, you can use 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();
    

    See Also:
    TcpConnectionInformation on MSDN
    IPGlobalProperties on MSDN
    Description of TcpState states
    Netstat on Wikipedia


    And here it is as an extension method on 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;
    }