Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Indy 10.6.5040 TCPServer Serverschliessen und Client Verbindungen trennen

  Alt 22. Dez 2013, 01:34
Hallo,

gibt es eine saubere Lösung Client verbindungen zu trennen wenn der TidTCPServer geschlossen wird?


Ein einfaches idTCPServer1.active := False reicht hier scheinbar nicht, denn dann friert das Programm ein. Ganz selten bekomme ich aber auch mal die Meldung "Die Verbindung wurde erfolgreich geschlossen" aber auch wirklich nur sehr selten und das Programm friert dennoch ein.
Wenn jeder Client von sich aus die Verbindung beendet und ich dann das Programm schliesse lässt es sich auch ohne Probleme beenden.

Die Suche und auch alle Demo Programme die ich gefunden habe bringen mich dabei leider auch nicht weiter. Im Form Close habe ich bereits alles bisher gefundene einmal probiert leider bisher ohne Erfolg. Beende ich das Programm ohne vorher idTCPServer1.active := False aufzurufen endet es in eine access violation. Denke mal das die Threads natürlich noch laufen werden und sie daher kommt.

Ich poste einfach mal mein FormClose
Delphi-Quellcode:
procedure TServerMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I: Integer;
begin
  if IdTCPServer.Active then
  begin
// while IdTCPServer.Contexts.LockList.Count > 0 do
// begin
// TIdContext(IdTCPServer.Contexts.LockList[0]).Connection.IOHandler.CloseGracefully;
// end;

    Memo1.Lines.Add(Format('%d connected Clients', [IdTCPServer.Contexts.LockList.Count]));
    if IdTCPServer.Contexts.LockList.Count > 0 then
    begin
      for I := 0 to IdTCPServer.Contexts.LockList.Count -1 do
      begin
        //TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.IOHandler.CloseGracefully;
        //TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.DisconnectNotifyPeer;
        //TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.Disconnect;
        //TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.IOHandler.DiscardAll;
        //TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.IOHandler.CheckForDisconnect(False, True);
        //TIdContext(IdTCPServer.Contexts.LockList[i]).Connection.CheckForGracefulDisconnect(False);
      end;
    end;

    //IdTCPServer.Contexts.UnlockList;
    IdTCPServer.Active := False;
  end;
end;
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.

Vielen Dank im vorraus wenn mir jemand bei dem Problem helfen könnte, ich selbst bin ratlos.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat