AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy9: Connected Eigenschaft funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Indy9: Connected Eigenschaft funktioniert nicht

Offene Frage von "Exceeder"
Ein Thema von Exceeder · begonnen am 9. Mär 2010 · letzter Beitrag vom 10. Mär 2010
Antwort Antwort
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#1

Indy9: Connected Eigenschaft funktioniert nicht

  Alt 9. Mär 2010, 10:11
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?
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Indy9: Connected Eigenschaft funktioniert nicht

  Alt 9. Mär 2010, 17:01
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Indy9: Connected Eigenschaft funktioniert nicht

  Alt 9. Mär 2010, 18:44
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

Oder?
Michael Justin
  Mit Zitat antworten Zitat
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#4

Re: Indy9: Connected Eigenschaft funktioniert nicht

  Alt 10. Mär 2010, 11:27
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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