Como reconectar-se a um soquete normalmente

Eu tenho um método a seguir que se conecta a um ponto final quando meu programa é iniciado

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

Eu também tenho um timer definido para disparar a cada 60 segundos para chamarCheckConnectivity, que tenta enviar uma matriz de bytes arbitrária para o ponto final para garantir que a conexão ainda esteja ativa e, se o envio falhar, tentará se reconectar.

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));
    }
}

Então, como eu testaria o acima, é desconectar fisicamente o cabo LAN do meu dispositivo ethernet, permitindo que meu código tente se reconectar (o que obviamente falha) e reconectar novamente o cabo LAN.

No entanto, mesmo após reconectar o cabo da LAN (capaz de executar ping), o ChannelSocket.Connect (ChannelEndPoint) no meu método Reconnect sempre gera esse erro

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

Se eu reiniciar meu aplicativo inteiro, ele será conectado com êxito. Como ajustar meu método de reconexão para que não seja necessário reiniciar o aplicativo para reconectar ao dispositivo Ethernet?

questionAnswers(3)

yourAnswerToTheQuestion