Wie stelle ich eine ordnungsgemäße Verbindung zu einem Socket wieder her?

Ich habe folgende Methode, die eine Verbindung zu einem Endpunkt herstellt, wenn mein Programm startet

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

Ich habe auch einen Timer, der alle 60 Sekunden ausgelöst wird, um @ aufzurufeCheckConnectivity, das versucht, ein beliebiges Byte-Array an den Endpunkt zu senden, um sicherzustellen, dass die Verbindung noch besteht. Wenn der Sendevorgang fehlschlägt, wird versucht, die Verbindung wiederherzustellen.

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

Wie ich das oben beschriebene testen würde, müsste ich das LAN-Kabel physisch von meinem Ethernet-Gerät abziehen, damit mein Code versuchen kann, erneut eine Verbindung herzustellen (was offensichtlich fehlschlägt) und das LAN-Kabel wieder anzuschließen.

Auch nach dem erneuten Anschließen des LAN-Kabels (Ping möglich) gibt ChannelSocket.Connect (ChannelEndPoint) in meiner Reconnect-Methode immer diesen Fehler aus

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

Wenn ich meine gesamte Anwendung neu starten möchte, wird die Verbindung erfolgreich hergestellt. Wie kann ich meine Wiederverbindungsmethode so anpassen, dass ich meine Anwendung nicht neu starten muss, um die Verbindung zu meinem Ethernet-Gerät wiederherzustellen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage