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!
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?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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!
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.
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!