AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy FTP Server: Client rauswerfen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy FTP Server: Client rauswerfen

Ein Thema von Nersgatt · begonnen am 4. Jun 2012 · letzter Beitrag vom 5. Jun 2012
Antwort Antwort
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
Benutzerbild von Nersgatt
Nersgatt

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

AW: Indy FTP Server: Client rauswerfen

  Alt 5. Jun 2012, 09:47
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...
Jens
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 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