Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy] TCPServer mit aktiver Verbindung beenden (https://www.delphipraxis.net/29598-%5Bindy%5D-tcpserver-mit-aktiver-verbindung-beenden.html)

Duffy 11. Sep 2004 15:57


[Indy] TCPServer mit aktiver Verbindung beenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen,
ich brüte schon seit einiger Zeit daran. Wie kann einen Indy TCPServer mit aktvier Verbindung beenden, ohne daß ich die Fehlermeldung "Terminate Thread Timeout" bekomme. Irgendwie muß es gehen!

Danke
Claus

Dax 11. Sep 2004 18:07

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Versuch doch mal folgendes, TCP-Server mit .Active zu deaktivieren (einfach false setzen).

Duffy 12. Sep 2004 01:02

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo Dax,
danke für deine Antwort. Das habe ich schon probiert. Weiter bin ich durch alle Verbindungen iteriert und habe sie sogar Client-seitig beendet. Alles nichts genützt.

bye
Claus

Dax 12. Sep 2004 13:44

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Dann verstehe ich dein Problem nicht. Versuchs doch mal mit den neuen Indy-Komponenten, falls deine schon älter sind.

Duffy 12. Sep 2004 14:00

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo Dax,
Zitat:

Zitat von Dax
Dann verstehe ich dein Problem nicht. Versuchs doch mal mit den neuen Indy-Komponenten, falls deine schon älter sind.

ich benutze die Indy's 9.0.0.14. Das Problem was ich habe ist, sofern noch ein Client offen ist, daß ich den Server nicht sauber beenden kann, siehe Fehlermeldung. Die Clients sind so programmiert, daß sie automatisch wieder die Verbindung zun Server suchen. Gehe ich jetzt her und beende einen Client nach dem Anderen, dann klappt es auch den Server ohne Fehlermeldung zu schließen.

bye
Claus

Dax 12. Sep 2004 14:01

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Dann schicke doch einen Destroy-Befehl an die Clients, die dann die Verbindgung beenden und nicht versuchen, neu zu verbinden.

Duffy 12. Sep 2004 14:05

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo Dax,
sie sollen sich ja wieder verbinden können, aber das automatisch. Ich sende dem Client schon einen Shutdown Befehl, der dann die Verbindung Client-seitig schließt. Trotzdem wird der Server nicht mit seiner Thread-Bearbeitung fertig.

bye
Claus

Dax 12. Sep 2004 14:28

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Dann iterier doch durch die Threads des Servers und Terminiere sie...

Duffy 12. Sep 2004 15:20

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo Dax,
auch das habe ich bereits versucht ...
Delphi-Quellcode:
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  ACommBlock: TCommBlock;
  I: Integer;
begin
  ACommBlock.Command := CmdShutdown;
  for I := 0 to Server.Threads.LockList.Count - 1 do
  begin
    TIdPeerThread(Server.Threads.LockList[I]).Connection.WriteBuffer(ACommBlock, SizeOf(ACommBlock), True); // sendet Shutdown Meldung an den Client, der die Verbindung selber schließt
    TIdPeerThread(Server.Threads.LockList[I]).Connection.DisconnectSocket; // Sicher ist sicher !!!
    TIdPeerThread(Server.Threads.LockList[I]).Stop; // Terminate etc. alles ohne Erfolg
  end;
  CanClose := True;
end;
danke trotzdem. Irgendwo, gibt es einen Haken in meinem Code, der das verursacht. Aber was.

bye
Claus

Dax 12. Sep 2004 15:24

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Versuch doch mal anstatt .Stop lieber .Terminate..

Duffy 12. Sep 2004 15:25

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo Dax,
selbes Ergebnis ...

bye
Claus

Dax 12. Sep 2004 15:26

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Ganz rabiat: TCPServer.Destroy;

Duffy 12. Sep 2004 15:31

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo Dax,
dann kommt ein Zugriffsfehler, was aber auch logisch ist, denn die Komponente liegt auf dem Formurlar. Es muß da eine saubere Lösung geben.

bye
Claus

linobrocken 21. Sep 2004 15:55

Re: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hallo,
ich habe genau das selbe Problem, nur das bei mir noch hinzukommt das ,wenn ich ein Client disconnected und danach ein weiterer die Routine OnDisconnect auf Server Seite einfach nicht ausgeführt wird, weil der Server noch im OnExecute festhängt.

Gruß Pascal

Jakson 22. Mär 2012 11:31

AW: [Indy] TCPServer mit aktiver Verbindung beenden
 
Hatte gerade das selbe Problem.

Wurde folgendermaßen gelöst:
Code:
procedure TForm.FormDestroy(Sender: TObject);
var MyList : TList;
    Count : Integer;
begin
 MyList := IdTCP_Server.Contexts.LockList;
 try
  for Count := 0 to MyList.Count - 1 do
   TIdContext(MyList[Count]).Connection.Disconnect;
 finally
  IdTCP_Server.Contexts.UnlockList;
 end;
 IdTCP_Server.Active := False;
end;
Bei beenden des Programms werden alle noch offenen Verbindungen getrennt.
Die mit LockList gesperrte Liste muss natürlich wieder mit UnlockList entsperrt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz