c# TcpClient juzga si el estado de la conexión está desconectado

En primer lugar, aclare un problema, TcpClient es la encapsulación de scoket y TcpClient.Client es el objeto de socket original.

En segundo lugar, no puede usar client.Client.Connected o client.Connected para juzgar si todavía está conectado, porque esta propiedad solo se actualizará después de conectarse o desconectarse activamente o enviar y recibir información , y no es un estado en tiempo real.

Microsoft dijo que es posible llamar a Send() sin bloqueo para enviar un mensaje de byte 0. Si el envío es exitoso, significa que todavía está conectado. Si se lanza una excepción, la conexión se ha desconectado. Sin embargo, se encuentra en el experimento que no funciona. El extremo remoto se desconecta y se envía. El mensaje de 0 bytes todavía no informará un error. Se sospecha que está relacionado con la encapsulación de TcpClient. Tal vez un mensaje vacío no funcione. directamente. Por lo tanto, se cambió para enviar 1 byte, y normalmente se informó un error después de que se desconectó la conexión.

El método de detección de la conexión es el siguiente, si todavía está conectado, devuelve verdadero, y si está desconectado, devuelve falso

 public bool IsSocketConnect(TcpClient client) //判断一个socket是否处于连接状态
    {
    
           
        if (client == null||client.Client == null)
        {
    
    
            return false;
        }
        //先看看状态
        if (client.Client.Connected == false || client.Client.RemoteEndPoint == null)
        {
    
    
            return false;
        }
        //尝试发送以非阻塞模式发送一个消息 注意这个非阻塞模式不会影响异步发送
        bool blockingState = client.Client.Blocking;
        try
        {
    
    
            byte[] tmp = new byte[1];
            client.Client.Blocking = false;
            client.Client.Send(tmp, 1, 0);
            return true;
        }
        catch (SocketException e)
        {
    
    
            // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的  这个错误是说发送缓冲区已满或者客户端的接收缓冲区已满
            if (e.NativeErrorCode.Equals(10035))
                return true;
            else
                return false;
        }
        finally
        {
    
    
            client.Client.Blocking = blockingState; //恢复状态
        }
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_44568736/article/details/130990283
Recomendado
Clasificación