![]() |
TIdTCPServer beenden und alle Clientverbindungen schließen?
Ich habe gerade einen TCP-Server in Arbeit und habe mich seit langen mal wieder für die Indy-Komponenten entschieden, bin da aber schon wieder in der Exception-Hölle angelangt (ich wußte doch, dass es da einen Grund gegeben hat, die zu meiden :evil:).
Speziell das Beenden mit bestehenden Clientverbindungen wirft eine EIdNotConnected - Exception (Verbindung getrennt) wenn ich vor dem Ende Server.Active auf FALSE setze. Mache ich das nicht wird eine EIdNotConnected Exception (Nicht verbunden) für jede offene Client-Verbindung geworfen. Irgendwie lässt sich erstere auch durch einen try/except Block nicht abfangen. Da das ganze als Service laufen muss, bei dem es keine Möglichkeit gibt darauf zu reagieren (und auf sonstige Exception die da sonst nocht kommen könnten!), hier die Frage ob es einen Weg gibt die Clientverbindungen zu schließen (wenn keine Verbindungen offen sind lässt sich der Server ohne Exceptions schließen) oder alle Exceptions beim Beenden (des Servers) zu unterbinden? Das aktuelle Ende sieht wie folgt aus (Service gestoppt):
Delphi-Quellcode:
Das Protokoll ist übrigens vorgegeben und ein Quit-Befehl wie manchmal empfohlen wird, lässt sich leider nicht umsetzen (bringt auch nichst wenn der Server einfach dicht machen muss).
destructor TRemoteServer.Destroy;
//var // i: Integer; begin if fIdSrv.Active then // fIdSrv = TIdCmdTCPServer begin try // for i := 0 To fIdSrv.Contexts.Count-1 do // begin // fIdSrv.Contexts[i].Disconnect; // wäre schön? // end; fIdSrv.Active := FALSE; except end; end; inherited; end; Falls das nicht hinzukriegen ist, gibts alternativen zu Indy die weniger "Ausnahmelasting" sind? |
AW: TIdTCPServer beenden und alle Clientverbindungen schließen?
Hallo,
hat der Indy TCPServer nicht einen Exception Handler (onException) mit denen du die Exceptions abfangen/loggen kannst?
Delphi-Quellcode:
Ich trenne die Clients auch einfach damit den Server auf nicht aktiv zu setzen.
procedure TsimpleL3DC.ServiceCreate(Sender: TObject);
var configData : TConfigData; begin fLogger := TLogger.instance; configData := TConfigData.create; try fFileManager := TFileManager.create(includeTrailingPathDelimiter(configData.dataPath)); fTcpListener := TidTcpServer.Create(nil); try fTcpListener.OnExecute := onExecute; fTcpListener.OnConnect := onConnect; fTcpListener.OnDisconnect :=onDisconnect; fTcpListener.OnException := onException; fTcpListener.DefaultPort := configData.listenerPort; except on E:Exception do fLogger.add(0,'Error while creating listener socket. '+E.Message); end; finally configData.Free; end; end; procedure TsimpleL3DC.ServiceDestroy(Sender: TObject); begin if assigned(fTcpListener) then begin fTcpListener.Active := false; freeAndNil(fTcpListener); end; fLogger.Free; fFileManager.Free; end; Der Service fliegt mir dabei aber nicht um die Ohren. Grüße Klaus |
AW: TIdTCPServer beenden und alle Clientverbindungen schließen?
Zitat:
Wenn ich das richtig verstehe "ignorierst" du die Exceptions die beim Active=FALSE setzen auftreten einfach? Das heißt aber, das:
Delphi-Quellcode:
unterhalb meines Kommentars nichts mehr ausgeführt wird, sobald ein Client verbunden war (was eigentlich ein Memoryleak prodziert)?!
procedure TsimpleL3DC.ServiceDestroy(Sender: TObject);
begin if assigned(fTcpListener) then begin fTcpListener.Active := false; //--- ab hier wird nicht mehr ausgeführt, wenn oben eine Exception auftritt --- freeAndNil(fTcpListener); end; fLogger.Free; fFileManager.Free; end; |
AW: TIdTCPServer beenden und alle Clientverbindungen schließen?
Ob das eine gute Idee ist, das im OnCreate und OnDestroy zu machen?
Eigentlich werden solche Instanzen im OnStart und OnStop erzeugt und freigegeben. Das aber nur so am Rande |
AW: TIdTCPServer beenden und alle Clientverbindungen schließen?
Guten Morgen,
@Whookie Ein Memory-Leak ist mir noch nicht aufgefallen. [So oft wird der Service auch nicht neu gestartet...] Wenn Du möchtest kannst Du das ja noch in try-finally einpacken. Der finally Block sollte auf jeden Fall ausgeführt werden. @Sir Rufo Danke für den Hinweis. Werde ich noch ändern. Grüße Klaus |
AW: TIdTCPServer beenden und alle Clientverbindungen schließen?
Zitat:
Da das beenden eines Servers nicht die Regel (und daher? Na? Genau! Eine Ausnahme!) ist, ist es insofern logisch, das eine Exception geworfen wird. Auf der Clientseite wirst Du auch eine Exception bekommen, sofern der Client halbwegs ordentlich implementiert ist (10054, soweit ich mich erinnere). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz