Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy FTP Server: Client rauswerfen (https://www.delphipraxis.net/168679-indy-ftp-server-client-rauswerfen.html)

Nersgatt 4. Jun 2012 08:11

Indy FTP Server: Client rauswerfen
 
Moin!

Ich habe einen FTP-Server mit Indy 10.5.5 gebastelt. Die Clients sind mobile Geräte, die unter VB.net programmiert wurden. Es kommt vor, dass die Verbindung abbricht (kein Netzempfang, Gerät wird während der Übertragung ausgeschaltet, Bombeneinschlag :-D, etc).
Nun bleiben die Verbindungen aber im FTP-Server stehen. Die würde ich gern nach einer gewissen Zeit rauswerfen. Dafür erstelle ich mir im Context.Data der Clientverbindung ein Objekt, das unter anderem einen sog. Heartbeat enthält. Immer wenn der Client irgendwie mit dem Server kommuniziert, wird dieser Heartbeat aktualisiert.

Nun habe ich einen Timer erstellt, der alle 10 Sekunden ausführt wird. Der prüft, ob der letzte Heardbeat mehr als x Sekunden her ist und soll dann evtl. den Client einfach rauswerfen:
Delphi-Quellcode:
procedure TfrmFTP.tmrDisconnectTimer(Sender: TObject);
var
  l : TList;
  context : TIdFTPServerContext;
  i : Integer;
  ui : TUserInfo;
begin
  inherited;

  l := Ftp.Contexts.LockList;
  try
    for i := 0 to l.Count - 1 do
    begin
      context := TIdFTPServerContext(l.Items[i]);
      if TryGetUserInfo(context, ui) then
      begin
        if GetTickDiff(ui.LastHeartbeat, GetTickCount) >= FTimeout then
        begin
          AddLogMessage(context, 'Client wird zwangsgetrennt (Timeout)', ltHint);
          context.Connection.Disconnect(False);
        end;
      end;
    end;
  finally
    ftp.Contexts.UnlockList;
  end;


end;
Dieses Vorgehen klappt in 95% der Fälle. Aber es gibt einige Fälle, wo die Verbindung in der Liste bestehen bleibt. Obwohl der Client definitiv nicht mehr da ist (Gerät ausgeschaltet). Trotzdem bekomme ich auf diese Art den Client nicht rausgeworfen. So läuft das Programm alle 10 Sekunden in diesen Programmteil und der Kunde sieht alle 10 Sekunden diesen Logtext (Client wird zwangsgetrennt..)
Ich kann nicht wirklich nachvollziehen, woran das liegt. Ich hab auch Probleme, dieses Problem bei mir im Büro nachzustellen. Denn natürlich tritt das nur beim Kunden auf und nicht bei mir. Wie gesagt in 95% der Fälle funktioniert das. Ich schalte den Client während der Übertragung aus: funktioniert. Ich verbinde mich mit der Windows FTP.exe und kille während der Übertragung den FTP.exe-Prozess: funktioniert.

Tipps, Hinweise, wilde Spekulationen sind willkommen!
Jens

Nersgatt 5. Jun 2012 08:47

AW: Indy FTP Server: Client rauswerfen
 
Keiner eine Idee? :(
Im Prinzip, wenn man sich mal durch den Indy-Quelltext wühlt, dann bricht es sich ja runter auf den TIdTcpConnection.Disconnect. Aber ich komme einfach nicht weiter... :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 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