Laden...

TcpClient + Networkstream empfängt nach 30 Sekunden Leerlauf keine Daten mehr

Erstellt von Powerslave vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.057 Views
P
Powerslave Themenstarter:in
554 Beiträge seit 2005
vor 9 Jahren
TcpClient + Networkstream empfängt nach 30 Sekunden Leerlauf keine Daten mehr

Hallo,

ich connecte mich über TCP mit einem Ethernet-Barcodeleser, der eine IP-Adresse hat.

Dazu verwende ich folgenden (vereinfachten) Code:


using (TcpClient client = new TcpClient("192.168.20.41", 1002))
{
    using (NetworkStream stream = client.GetStream())
    {
        while (true)
        {
            int readCount;
            byte[] data = new byte[client.ReceiveBufferSize];

            while (stream.DataAvailable && (readCount = stream.Read(data, 0, client.ReceiveBufferSize)) != 0)
            {
                strData += Encoding.UTF8.GetString(data, 0, readCount);
            }

            if (!string.IsNullOrWhiteSpace(strData) && strData.EndsWith(endOfLine))
            {
                OnRead(strData);
                strData = "";
            }

            //Thread.Sleep(200);
        }
    }
}

Wenn ich die Applikation starte und Barcodes einscanne erhalte ich die richtigen Werte vom Gerät. Wenn ich allerdings 30 Sekunden im Leerlauf bin, also 30 Sekunden lang seit dem Start der Applikation oder seit dem letzten gescannten Barcode vergangen sind, werden keine Daten vom Gerät mehr empfangen. Networkstream.DataAvailable bleibt immer false, TcpClient.Available bleibt immer 0, aber TcpClient.Connected ist immernoch true. Wenn ich die Applikation neustarte, geht es wieder.

Muss ich die Verbindung irgendwie am Leben halten? Was könnte dafür sonst die Ursache sein?
Vielleicht hat jemand eine Idee.

Danke im Voraus!

Achtung! - Hinter dir ist ein dreiköpfiger Affe!

16.825 Beiträge seit 2008
vor 9 Jahren

Kann das sein, dass der Scanner einfach nach einer gewissen Zeit die Verbindung kappt und bei einem erneuten Scan einfach neu aufbaut; Du darauf aber nicht reagierst?

P
Powerslave Themenstarter:in
554 Beiträge seit 2005
vor 9 Jahren

Danke,
Möglich ist es bestimmt. Hab leider so gut wie keine Schnittstellenbeschreibung vom Gerät. Kann mir aber morgen nochmal die Konfiguration anschauen, ob ich dort was von nem Timeout finde.

Falls es so wäre, wie könnte ich denn darauf reagieren, da meine Applikation ja die Verbindung aufbaut und der Scanner nichts von meiner App weiß?
TcpListener kann ich in diesem Fall ja nicht verwenden, TcpClient ist schon die richtige Komponente oder?

Achtung! - Hinter dir ist ein dreiköpfiger Affe!

W
872 Beiträge seit 2005
vor 9 Jahren

Manchmal kappen Firewalls oder Endgeräte die Verbindung automatisch, wenn mehr als x-Sekunden nix passiert.
Deswegen gibt es meistens etwas wie eine Ping/Echo-Nachricht, um die Verbindung aufrecht zu erhalten. Schaue danach mal in der Dokumentation.

P
Powerslave Themenstarter:in
554 Beiträge seit 2005
vor 9 Jahren

Ok, es ist wirklich ein "Port Timeout = 30 seconds" am Gerät eingestellt.

Dann krieg ich das hin, danke.

Achtung! - Hinter dir ist ein dreiköpfiger Affe!