Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Verbindung beendet, weder Client noch Server merken es (https://www.delphipraxis.net/90080-verbindung-beendet-weder-client-noch-server-merken-es.html)

halinchen 11. Apr 2007 10:12


Verbindung beendet, weder Client noch Server merken es
 
Hi!

Erstmal: Ich nutze Indy 9

Ich bin gerade dabei ein Chat zu programmieren. Ich habe 1 Server und alle Clients verbinden sich mit dem.
Angenommen ich habe 2 Rechner.
Auf PC 1 läuft 1 Server und 1 Client. (Client ist mit Server verbunden).
Auf PC 2 läuft 1 Client (Mit dem Server auf PC 1 verbunden).

Soweit funktioniert es. Wenn ich nun den Client auf PC 2 schließe wird beim Server OnDisconnect aufgerufen und ich kann den Clienten aus der Userliste rausnehmen.

Wenn ich aber die LAN-Verbindung bei PC 2 trenne, denken der Client auf PC 2 und Server auf PC 1 immer noch sie seien verbunden!!
Gut, ich dachte sobald der Server etwas über die Leitung sendet sollte er ja merken das da was nicht hinhaut, aber nein! Der Server sendet fröhlich weiter! Nach einer Weile wird der Server und etwas träge... Und dann hat meine Delphi IDE Windows lahmgelegt. Ich nehme an der Server schreibt in sowas wie einen Puffer.
Beim Clienten auf PC 2 kam beim Senden wenigstens ein Fehler... (Da freut man sich über einen Fehler! :stupid: )

Ich habe schon verschiedene Möglichkeiten probiert: :idea:
  • vor dem Senden CheckForDisconnect
  • vor dem Senden CheckForGracefulDisconnect
  • ich habe jede Minute eine Anfrage geschickt und der Client sollte auf die Anfrage antworten. Allerdings ging das Zeitlich nicht: Der Server läuft in mehren Threads, er wartet auf irgenteine Info und im anderen Thread wollte der Server wissen ob der Client antwortet, irgentwie konnte sich der Client dann nicht einmal mehr einloggen (ich nehme mal an das der Server in mehreren Threads läuft, was soll sonst schiefgelaufen sein? :?: )

Es ging alles nicht.

Wie kann ich also nun hinbekommen das der Server 100% mitbekommt wenn die Verbindung geschlossen ist, oder wie kann ich vor dem Schreiben (oder dabei) mitbekommen wenn die Verbindung beendet wurde.

Oder besser: Wie macht ihr sowas :mrgreen: :mrgreen:

Mutator 11. Apr 2007 10:37

Re: Verbindung beendet, weder Client noch Server merken es
 
ich hab zwar keine ahnung von socket programmierung aber ne idee ^^
Wie währe es wenn der Server in regelmäßigen abständen den Clienten anpingt und wenn er vom ping keine antwort bekommt beendet er die Verbindung.

halinchen 11. Apr 2007 10:44

Re: Verbindung beendet, weder Client noch Server merken es
 
Danke für deine Antwort! :thumb:

Mit Pingen war das so eine Sache...
Manche Ping-Proceduren brauchten Admin-Rechte und die anderen brachte ich gar nicht zum laufen :angel2: .

Außerdem: Manche Firewalls lassen Windows nicht auf Pings reagieren, und ich wollte eigentlich ein einfach zu konfigurierendes Chatprgramm basteln...

Ich informiere mich nochmal wegen Pingen, und wer ein andere Idee hat kann sich ja melden.

Sidorion 11. Apr 2007 11:31

Re: Verbindung beendet, weder Client noch Server merken es
 
Schicke zykisch vom Server aus eine bestimmte Nachricht an alle Clients. Wenn diese innerhalb einer bestimmten Zeit nicht antworten, fliegen sie aus der Liste.
Oder andersrum, jeder Client schickt zyklisch ein 'Lebenszeichen'. Bleibt dieses aus, ist der Client tot und muss sich gegebenenfalls neu registrieren, wenn die Verbindung wieder steht.

halinchen 11. Apr 2007 11:44

Re: Verbindung beendet, weder Client noch Server merken es
 
Danke!

Das habe ich schon probiert (das dritte).

Ich versuche mal zu erläutern, warum ich denke das es nicht ging:
Ich Sende als 1. einen Aufzählungstyp (Loggin,Message,...) und dann noch einen String und einen MemoryStream (oder nur eins von beiden, je nachdem was im Aufzählungstyp stand). Nun wartet der Client auf eine Antwort vom Server. Und so wie ich das verstanden habe, läuft der Server in Threads, sprich: Es kann passieren das diese Aufforderung zum senden das er noch da ist eher gesendet wird als die Rückantwort auf die Anfrage des Clienten. Das ist natürlich ein anderer Typ und es wird ein Exception ausgelöst. Der Server bekommt dann aber wieder keine Antwort vom Clienten usw.

Das System müsste ich dann so ausbauen das es irgentwie sowas umgeht. Aber ich dachte es gibt ein Indy Funktion die das ganz einfach macht und ich das nur übersehen habe.

Außerdem finde ich das Debuggen von 2 Programmen gleichzeitig recht mühsam und ich komm dann zu falschen Ergebnissen, weil auf einmal Delphi die Units verwechselt hat und ich was sehe was der gar nicht macht. Und manchmal legt Delphi gleich alles lahm.

OK, ich war am Anfang auch für dieses Prinzip, bis ich nach etlichen Versuchen aufgegeben habe, aber wenn kein Weg vorbeiführt.... :|

Danke nochmal an alle! :thumb:

Sidorion 11. Apr 2007 12:25

Re: Verbindung beendet, weder Client noch Server merken es
 
Das Senden von Lebenszeichen sollte clientseitig asynchron ablaufen (sprich: er wartet nicht auf die Antwort). Auf dem Server kann man dann im OnClientRead bei Ankunft eines Lebenszeichens eine Zeitvariable aktualisieren und dann timergesteuert die Variable prüfen. Wenn das Lebenszeichen für einen Client zu alt wird, beendet man den entsprechenden Thread (antworten braucht er ja dann eh nichtmehr).
Das Lebenszeichen dient nur dazu, dass der Server merkt, dass der Client weg ist. Der Client merkt durch den Timeout der normalen Anfrage, dass der Server weg ist, von daher kannst Du nicht durcheinander kommen.

halinchen 11. Apr 2007 12:30

Re: Verbindung beendet, weder Client noch Server merken es
 
Klingt gut! :-D
Ich bin immer davon ausgegangen, das der Server eine Anfrage schicken muss.

Danke! :cheers: :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 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