Hi,
ich versteh nicht warum Du Dich nicht auf die Methoden von
Indy selber berufst/verlässt.
Den Server auf Active false zu setzen, sollte reichen um alle noch verbundenen Clients zu trennen.
Wenn Du aber schon mit einem eigenen Protokoll arbeitetest,
dann sollte es doch möglich sein, denn Clients eine Nachricht zu schicken, das dieser sich dann disconnected.
Ja, Du hast geschrieben das Du diese Möglichkeit nicht möchtest, weil der Client ja im Nirvana hängen könnte ....
Aber stell Dir mal vor an Deinen Server hängen 500 Clients und anstatt das sich 499 sauber abmelden und
nur der eine der sich aufgehängt hat "gekickt" wird.
Willst Du gleich alle 500 "kicken" ?!
Ich empfehle Kommando an die Clients, das diese sich sauber abmelden.
Wer nicht nach 5 Sekunden disconnected ist wird "gekickt".
Um solche Probleme aber im Keim zu ersticken empfehle ich Dir:
- Client und Server senden jeweils in regelmässigen Abständen ein "NOOP" oder ähnliches um den Status der Leitung zu prüfen
- Zu jedem Client Informationen zu speichern unter anderem auch den Zeitpunkt der letzten "Aktion"(Empfangen/Senden)
- im Intervall X die Liste der Clients prüfen und Clients mit zu alter "LastAction" mit einem speziellen Abfrage-Kommando prüfen
kommt keine Antwort auf dieses Kommando, dann und nur dann wird die Verbindung "hart" vom Server getrennt.
- Beim runterfahren des Servers, vorher alle Clients benachrichtigen, so das sich diese im Zeitraum X selber sauber abmelden können,
nur restliche Clients durch
Indy selber "kicken" lassen.
Früher unter Indy9 hatte ich auch ab und an den Fall das ich mich speziell um den ein oder anderen Client kümmern mußte,
aber jetzt mit Indy10(10.2.3 Snapshot) reichen oben genannte Massnahmen um einen sauberen Ablauf zu gewährleisten.
Bei mir laufen in drei verschiedenen Serveranwendung zwischen 100 und 999 Clients mit oben genannter Technik sauber.
Gruß Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.