none
Netzwerkverbindung überwachen RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,

    ich habe mir ein Programm geschrieben das per TCP eine Verbindung zu einem Scanner herstellt.

    Die Verbindung und Datenübertragung funktioniert auch sehr gut. Jedoch kann es dazu kommen das die Verbindung abbrechen kann. Somit können vom Scanner keine Daten mehr empfangen werden.

    Wie kann ich am besten eine automatischen reconnect erstellen wenn der Scanner die Verbindung verloren hat? Und gibt es da eine Anzeige wenn keine Verbindung mehr besteht?

    Hier mein Code

    public class Communicator
        {
            public event ScanEventHandler ScanEvent;
    
            private TcpClient Client;
            private NetworkStream stream;
    
            byte[] buffer;
            string _scanData;
            bool _scannerDisconnect;
    
            public IPAddress Ip { get; set; }
            public int Port { get; set; }
    
            public ommunicator(string ip, int port)
            {
                this.Ip = IPAddress.Parse(ip);
                this.Port = port;          
            }
    
    /// <summary>
            /// Verbindungsaufbau zum Scanner über TCP
            /// </summary>
            /// <returns></returns>
            public bool Connect()
            {
                try
                {
                    Client = new TcpClient();
                    Client.ReceiveBufferSize = 8192;
                    Client.Connect(new IPEndPoint(this.Ip, this.Port));
                    stream = Client.GetStream();
                    ScanKltLabel();
                    BeginRead();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
    
            /// <summary>
            /// Trennen der Verbindung zum Scanner 
            /// </summary>
            /// <returns></returns>
            public bool Disconnect()
            {
                try
                {
                    Client.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
                                   
            /// <summary>
            /// Erstellt einen Buffer
            /// </summary>
            private void BeginRead()
            {          
                buffer = new byte[1024];
                stream.BeginRead(buffer, 0, buffer.Length, ReadComplete, buffer);
            }
    
            /// <summary>
            /// Funktion die die gesendeten Daten vom Scanner interpretiert
            /// </summary>
            /// <param name="iar"></param>
            private void ReadComplete(IAsyncResult iar)
            {
                    buffer = (byte[])iar.AsyncState;
                    stream.EndRead(iar);
    
                    string readData = Encoding.ASCII.GetString(buffer);
    
                    if (!readData.Contains("OK"))
                        this.ScanData = Encoding.ASCII.GetString(buffer).TrimEnd('\0').Replace("\r", "");
    
                    BeginRead();         
            }
        }

    Grüße

    Nejox

    Mittwoch, 10. Mai 2017 10:08

Alle Antworten

  • Hallo Nejox,

    Um die Verbindung wiederherzustellen, kannst Du eine der asynchronen BeginConnect-Methoden verwenden, wie im folgenden Thread beschrieben:
    How to reconnect to a socket gracefully

    Eine andere Lösung kann sein, die Send/ReceiveTimeout-Eigenschaft zu setzen und den Server zu pingen, wenn ein Timeout auftritt. Darüber hinaus TCP-KeepAlive-Option informiert Dich, wenn der Server nicht verfügbar ist. Weitere Informationen findest Du in diesem Link:
    TcpClient communication with server to keep alive connection in c#?

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 11. Mai 2017 10:00
    Administrator