![]() |
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:
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: |
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. |
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. |
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. |
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: |
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. |
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 00:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz