AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Verbindung beendet, weder Client noch Server merken es
Thema durchsuchen
Ansicht
Themen-Optionen

Verbindung beendet, weder Client noch Server merken es

Ein Thema von halinchen · begonnen am 11. Apr 2007 · letzter Beitrag vom 11. Apr 2007
Antwort Antwort
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#1

Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 11:12
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! )

Ich habe schon verschiedene Möglichkeiten probiert:
  • 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
  Mit Zitat antworten Zitat
Mutator

Registriert seit: 10. Jan 2007
Ort: Mannheim
11 Beiträge
 
Delphi 7 Professional
 
#2

Re: Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 11:37
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.
Wissen ist Macht, wisse viel und sei Mächtig
  Mit Zitat antworten Zitat
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 11:44
Danke für deine Antwort!

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

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.
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#4

Re: Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 12:31
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 12:44
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!
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#6

Re: Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 13:25
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Benutzerbild von halinchen
halinchen

Registriert seit: 13. Jun 2006
508 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Verbindung beendet, weder Client noch Server merken es

  Alt 11. Apr 2007, 13:30
Klingt gut!
Ich bin immer davon ausgegangen, das der Server eine Anfrage schicken muss.

Danke!
  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:25 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