Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy9: Connected Eigenschaft funktioniert nicht (https://www.delphipraxis.net/148835-indy9-connected-eigenschaft-funktioniert-nicht.html)

Exceeder 9. Mär 2010 09:11


Indy9: Connected Eigenschaft funktioniert nicht
 
Hallo,

ich habe folgendes Szenario in meiner Anwendung: Der Client baut zum Server eine Verbindung aus, die beiden machen ein Handshake. Anschließend liest der Client nur noch auf der Verbindung und wartet auf Kommandos vom Server. Parallel hat der Client noch schreibende Verbindungen offen, welche auf ähnliche Art und Weise erzeugt wurden.

Nun ist das Problem, dass die Funktion "Connected" der TIdTCPConnection auch dann noch True zurückliefert, wenn zwischenzeitlich der Rechner in den Standby geschickt wurde oder wenn z.B. das Netzwerkkabel (sowohl auf Client als auch auf Serverseite) entfernt wurde. Selbiges gilt für ein zusammengebrochendes WLAN bzw. UMTS/GPRS.

Der Server merkt ja nun spätestens beim nächsten Kommando, dass der Client nicht mehr da ist. Der Client bekommt allerdings niemals mit, dass die Verbindung unterbrochen wurde.

Das Problem tritt Hauptsächlich mit Hardware auf welche maximal 3 Jahre ist auf. Ich vermute deshalb, dass es ein Feature der Netzwerkkomponenten ist, dies nicht mehr mitzuteilen.

Wie begegnet man dem Problem am besten? Ideal wäre es natürlich, wenn der Client sofort merkt, wenn die Verbindung weg ist. Dann könnte der Status der Verbindung zurückgesetzt werden. In periodischen Abständen (oder noch besser, wenn die Verbindung wieder da ist), könnte der Handshake mit dem Server erneut vollzogen werden.

Jemand eine Idee dazu?

DataCool 9. Mär 2010 16:01

Re: Indy9: Connected Eigenschaft funktioniert nicht
 
Hi,

da Indy Blocking Sockets benutzt bekommt Indy nicht direkt mit wenn die Verbindung aus welchem Grunde auch immer verliert.
Sobald Du allerdings in die Verbindung "schreibst" wird das nicht vorhanden sein der Verbindung festgestellt.
Deshalb solltest Du "Dein Protokoll" so aufbauen, das von Zeit zu Zeit ein "NOOP" (No operation) gesendet wird,
was der Server dann empfängt und nicht verarbeitet.

Bei Indy10 gibt es noch einfachere Methoden, zuerst :
Delphi-Quellcode:
CheckDataForSorce(500); // <---- Millisek.
if not InputBufferEmpty then
// ...

Weiß aber nicht mehr ob das schon bei Indy9 so verfügbar ist.

Greetz Data

mjustin 9. Mär 2010 17:44

Re: Indy9: Connected Eigenschaft funktioniert nicht
 
Zitat:

Zitat von DataCool
da Indy Blocking Sockets benutzt bekommt Indy nicht direkt mit wenn die Verbindung aus welchem Grunde auch immer verliert.

Bei non blocking sockets wäre es nicht anders :P

Oder?

Exceeder 10. Mär 2010 10:27

Re: Indy9: Connected Eigenschaft funktioniert nicht
 
Hallo,

ich überlege gerade wie ich diese Geschichte mit dem Noop am besten integriere. Auch wenn Indy9 das vielleicht nicht kann, aber gibt es nicht in Windows entsprechende Events, mit denen man etwas anfangen kann? Die Frage wäre hier, wie man dann feststellen kann, ob bei mehreren Verbindungen (z.B. 2xLAN und 1xWLAN) die verwendete Verbindung abgerissen ist oder eine für mein Problem unerhebliche (Server steht z.B. im lokalen Netz und die Verbindung ins Internet reißt ab).

Ein wenig merkwürdig finde ich das Problem dennoch. Es erscheint wenig Zweckmäßig, dass man nicht mitbekommt, ob die Verbindung noch da ist. Indy9 fragt übrigens, wenn man "Connected" aufruft nach "CheckForDisconnect", was auch immer dort dann geschieht (oder auch nicht geschieht).

EDIT: Ich habe gerade noch die Methode "CheckForGracefulDisconnect" gefunden. Die macht in etwa das, was Indy10 bei "CheckDataForSorce" tut denke ich. Dort wird versucht mit einem ReadTimeout von 1 Sekunde auf dem Buffer zu lesen. Scheinbar aber auch ohne erfolg (danach steht Connected leider weiterhin auf True). Ist schon irgendwie merkwürdig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz