Einzelnen Beitrag anzeigen

Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Indy FTP Server: Client rauswerfen

  Alt 4. Jun 2012, 09:11
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 , 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
Jens
  Mit Zitat antworten Zitat