Egal was ich versuche der Server trennt den Client nicht und der Client bekommt auch keine Meldung über einen disconnect.
Rufe ich TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.Disconnect; auf dann wird am Server das OnDisconnect aufgerufen aber das war es dann auch schon.
Was da geschieht kann man ohne einen Blick auf die OnExecute Methode des Servers nicht sagen. Zwei häufige Probleme sind:
* eine in OnExecute aufgetretene
Indy-Exceptions wird abgefangen (zum Beispiel durch ein leeres except ... end)
* die Anwendung blockiert wenn in OnExecute ein Deadlock auftritt, zum Beispiel im Zusammenhang mit dem
VCL Thread
Beispiel:
Zitat:
(...) make sure that your server event handlers are not performing any synchronized operations to the main thread while the main thread is busy deactivating the server, otherwise a deadlock will occur.
(
Quelle)
Übersetzt:
Zitat:
"achte darauf, dass die Event Handler des Servers keine "synchronized" Operationen im Hauptthread ausführen, während der Mainthread dabei ist, den Server zu beenden, da sonst ein Deadlock entsteht"
Die normale Methode einen TIdTCPServer zu beenden ist Active auf False zu setzen. Wenn der Server blockiert, warten die Clients bei einer Read oder Write Operation bis zum Timeout, das je nach Betriebssystem eine längere Zeit dauert.
Indy TCP Clients erhalten keine explizite Benachrichtigung, wenn der Server die Verbindung trennt (das ist völlig normal bei
TCP/
IP).
Siehe auch:
http://stackoverflow.com/questions/1...n-deactivating