Cómo reconectarse a un enchufe con gracia

Tengo un siguiente método que se conecta a un punto final cuando mi programa comienza

ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var remoteIpAddress = IPAddress.Parse(ChannelIp);
ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
ChannelSocket.Connect(ChannelEndPoint);

También tengo un temporizador configurado para activarse cada 60 segundos para llamarCheckConnectivity, que intenta enviar una matriz de bytes arbitraria al punto final para asegurarse de que la conexión sigue viva, y si el envío falla, intentará volver a conectarse.

public bool CheckConnectivity(bool isReconnect)
{
    if (ChannelSocket != null)
    {
        var blockingState = ChannelSocket.Blocking;
        try
        {
            var tmp = new byte[] { 0 };
            ChannelSocket.Blocking = false;
            ChannelSocket.Send(tmp);
        }
        catch (SocketException e)
        {
            try
            {
                ReconnectChannel();
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
    else
    {
        ConnectivityLog.Warn(string.Format("{0}:{1} is null!", ChannelIp, ChannelPort));
        return false;
    }

    return true;
} 

private void ReconnectChannel()
{
    try
    {
        ChannelSocket.Shutdown(SocketShutdown.Both);
        ChannelSocket.Disconnect(true);
        ChannelSocket.Close();
    }
    catch (Exception ex)
    {
        ConnectivityLog.Error(ex);
    }

    ChannelSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    var remoteIpAddress = IPAddress.Parse(ChannelIp);
    ChannelEndPoint = new IPEndPoint(remoteIpAddress, ChannelPort);
    ChannelSocket.Connect(ChannelEndPoint);
    Thread.Sleep(1000);

    if (ChannelSocket.Connected)
    {
        ConnectivityLog.Info(string.Format("{0}:{1} is reconnected!", ChannelIp, ChannelPort));
    }
    else
    {
        ConnectivityLog.Warn(string.Format("{0}:{1} failed to reconnect!", ChannelIp, ChannelPort));
    }
}

Entonces, cómo probaría lo anterior, es desconectar físicamente el cable LAN de mi dispositivo ethernet, permitiendo que mi código intente reconectarse (lo que obviamente falla) y volver a conectar el cable LAN.

Sin embargo, incluso después de volver a conectar el cable LAN (capaz de hacer ping), ChannelSocket.Connect (ChannelEndPoint) en mi método de reconexión siempre arroja este error

No connection could be made because the target machine actively refused it 192.168.168.160:4001

Si tuviera que reiniciar toda mi aplicación, se conecta con éxito. ¿Cómo puedo ajustar mi método de reconexión para que no tenga que reiniciar mi aplicación para volver a conectarme a mi dispositivo Ethernet?

Respuestas a la pregunta(3)

Su respuesta a la pregunta