Laden...

timeout für tcpclnt.GetStream().Read definieren???

Erstellt von gustavmega vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.546 Views
G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 11 Jahren
timeout für tcpclnt.GetStream().Read definieren???

Hallo,

ich habe eine Cleint-Anwendung (mobiles Gerät), die sich mit einem Server verbindet und nach der Verbindung schickt sie dem Server einen Nachricht und wartet dann auf eine Antwort von dem Server und wenn sie was lesen kann, weiss sie dass der Nachricht beim Server angekommen ist und löscht sie anschliessend paar Dateien und beendet die Verbindung ansonsten soll sie eine Fehlermeldung geben.

Soweit funktioniert auch alles wunderbar, habe aber das Problem, dass wenn die Client-Anwendung mit dem Server verbunden ist aber keine Nachricht vom Server bekommt, bleibt sie dann hängen, nämlich bei bytesRead = stm.Read(message, 0, 100);


TcpClient tcpclnt = new TcpClient();
string stream = "Meinen Nachricht";
tcpclnt.Connect(IPv4, Port);                                    
Stream stm = tcpclnt.GetStream();

ASCIIEncoding asen = new ASCIIEncoding();
byte[] ba = asen.GetBytes(stream);
stm.Write(ba, 0, ba.Length);
byte[] message = new byte[100];
int bytesRead = 0;
bytesRead = stm.Read(message, 0, 100);

Würde gerne wissen, wie ich der Anwendung sagen kann, dass wenn sie nach bestimmte Zeit keine Nachricht lesen kann, soll sie die Verbindung beenden und dem Benutzer eine Fehlermeldung mitteilen?
Ich habe auch vor der Zeile bytesRead = stm.Read(message, 0, 100); mit _stm.ReadTimeout = 3000; _ versucht aber leider klappt es auch nicht!

Grüße,
G.M.

Z
403 Beiträge seit 2007
vor 11 Jahren

Die Lösung ist zu versuchen zyklisch etwas zu senden und die Exception abzufangen falls eine auftritt.
Denn leider kann man beim Read nicht feststellen ob die Verbindung noch besteht.

Dazu musst du ggf. dein Protokoll um ein Ping Paket erweitern.

G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 11 Jahren

aber das ist auch genau mein Problem, dass nachdem die Verbindung zum Server aufgebaut ist und die Datei an Server geschickt wurde wird versuch den Nachricht vom Server zu lesen und dann bleibt das Programm an dieser Stelle an stehen, da die Verbindung doch weiter besteht, oder habe ich Dich falsch verstanden?

Grüße,
G.M.

4.221 Beiträge seit 2005
vor 11 Jahren

ich sage nur stm.DataAvailable 😃

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 11 Jahren

ich sage nur stm.DataAvailable 😃

es handelt sich bei stm um einem Stream und nicht um einem NetworkStream-Objekt!

Grüße,
G.M.

Z
403 Beiträge seit 2007
vor 11 Jahren

Möglicherweise hab ich dich falsch verstanden:
Schau mal hier:NetworkStream.Read-Methode

W
872 Beiträge seit 2005
vor 11 Jahren

Da Du TCP benutzt, kannst Du an sich sicher sein, dass zumindest netzwerkmaessig das Senden vom Client an den Server geklappt hat, wenn Du keine Exception beim Send bekommen hast, da TCP ein verbindungsorientiertes Protokoll ist.
Ansonsten musst Du beim TCPClient die Eigenschaft ReceiveTimeout auf den Dir genehmen Wert setzen, da der Default Wert 0 ein endloses Lesen bedeutet.

4.221 Beiträge seit 2005
vor 11 Jahren

es handelt sich bei stm um einem Stream und nicht um einem NetworkStream-Objekt!

TcpClient.GetStream liefert einen NetworkStream !... wenn Du den nur als Stream definierst dann ist das Dein Problem... also ändere auf NetworkStream und schon funzt DataAvailable.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...