Einzelnen Beitrag anzeigen

mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Indy 10.6.5040 TCPServer Serverschliessen und Client Verbindungen trennen

  Alt 23. Dez 2013, 22:43
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
Michael Justin

Geändert von mjustin (23. Dez 2013 um 22:50 Uhr) Grund: Hinweis auf Synchronized
  Mit Zitat antworten Zitat