Einzelnen Beitrag anzeigen

hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: Indy TCPServer beenden mit toten Clients

  Alt 11. Jun 2012, 08:36
noch ein sauberes Beenden der Verbindung? (Schliessen des Sockets)

Delphi-Quellcode:

AContext.Connection.Disconnect
Wenn das Protokoll geändert werden kann, wäre ein Heartbeat-Verfahren eventuell eine Verbesserung, damit der Server verloren gegangene Verbindungen schneller erkennt und abräumt.

Update:

unter http://www.delphipraxis.net/157267-i...er-thread.html

werden noch diese Zeilen regelmäßig im Server OnExecute ausgeführt:
Delphi-Quellcode:
    AContext.Connection.IOHandler.CheckForDisconnect(False, True);
    AContext.Connection.CheckForGracefulDisconnect(False);
Jein Wird ein Disconnect vom Server versucht, hängt sich der Thread beim Beenden des Servers auf (das Problem, welches auch im verlinkten Post beschrieben wird).
Diese Hänger habe ich dadurch beseitigen können, dass der Server auf die Abmeldung (oder nicht Abmeldung) der Clients wartet. Das Server.Active := false macht übrigens auch ein Disconnect auf die vorhandenen Clients, deswegen das Jein.

Ich habe die Zeilen von oben mal im OnExecute eingebaut, keine Veränderung.
Mal eine Auflistung der Testszenarios und deren Auswirkung:

* Client meldet sich an Server an und Server wird beendet: Alles einwandfrei, der Client meldet sich ab und der Server beendet sich sauber.

* Client meldet sich an Server an, verliert die Connection, meldet sich nach Herstellung der Netzwerkverbindung erneut an Server an. Server wird beendet: Es sind zwei Connections in der Liste aufgelistet. Eine tote und eine aktive. An beiden wird das Ende-Signal gesendet. Der Server bekommt eine Exception (Socket-Error 10054) und beendet sich dann sauber.

* Client meldet sich an Server an, verliert die Connection. Redet nicht mit dem Server nach Herstellung der Netzwerkverbindung. Server wird beendet: Die tote Connection wird beendet und der Server bekommt eine Execption (Socket-Error 10054) und beendet sich dann sauber.

* Client meldet sich an Server an, verliert die Connection und kommt nicht wieder ins Netz. Server wird beendet: Es wird die Meldung an den toten Client gesendet und Server hängt sich auf. KEINE Exception, keine andere Meldung.

Wie gesagt: Nur wenn der Client netzwerktechnisch nicht mehr erreichbar ist, hängt sich der Server komplett auf.
  Mit Zitat antworten Zitat