Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   IdFTP No-transfer-time exceeded (https://www.delphipraxis.net/194620-idftp-no-transfer-time-exceeded.html)

mariusbenz 13. Dez 2017 14:05

IdFTP No-transfer-time exceeded
 
Hallo,

Eine Forumsuche hat bis jetzt noch nichts gebracht, deshalb ein neues Thema:

Quellcode vorab:
Delphi-Quellcode:
if IdFTP.Connected then
  begin
    IdFTP.List();
    for I := 0 to IdFTP.DirectoryListing.Count - 1 do
      begin
        [...]
      end
    [...]
  end;
Der Code ist Teil einer Funktion, die alle paar Sekunden von einem Timer ausgeführt wird. Funktioniert auch alles wunderbar. Aber nach ziemlich genau 10 Minuten kommt beim Ausführen der Zeile "IdFTP.List();" eine Exception:
exception class : EIdFTPServiceNotAvailable
exception message : No-transfer-time exceeded. Closing control connection.

Das einzige, was ich dazu gefunden hab, ist dass manche FTP-Server nach einer gewissen Zeit die Verbindung killen.
Allerdings prüfe ich ja vorher auf Connected ab, also bin ich ja prinzipiell noch verbunden?
Folgendes habe ich bereits versucht:
1. IdFTP.noop;
2. Jedes mal eine temporäre Datei uploaden
3. nach jedem Timer-Event disconnecten

1 hat nichts gebracht
2 und 3 haben funktioniert aber sind nur unschöne Workarounds.

Leider ist der Administrator unseres FTP-Servers im Urlaub, deshalb habe ich keine Ahnung, ob das am FTP-Server selbst liegt oder ob ich noch was anderes einstellen kann.

Redeemer 13. Dez 2017 18:26

AW: IdFTP No-transfer-time exceeded
 
Die Verbindung zu FTP kann in aller Regel nicht aufrecht gehalten werden. Daher ist Lösung 3 schon korrekt.

himitsu 13. Dez 2017 19:33

AW: IdFTP No-transfer-time exceeded
 
Zitat:

1 hat nichts gebracht
Nicht jeder FTP-Server reagiert auf NOOP, indem er dadurch den Timeout resettet,
und auch nicht jeder FTP-Client sendet diese Nachricht.

Oder aufrecht halten und reconnecten wenn es knallt.
Aber 10 Minuten ist jetzt auch recht lange, womit Punkt 3 natürlich die bessere Lösung ist.

mischerr 14. Dez 2017 07:28

AW: IdFTP No-transfer-time exceeded
 
Ich würde es wahrscheinlich quick-and-dirty so lösen:
Code:
  for j:= 0 to 1 do
    try
      if IdFTP.Connected then
        begin
          IdFTP.List();
          for I := 0 to IdFTP.DirectoryListing.Count - 1 do
            begin
              [...]
            end
          [...]
          break;
        end;
    except
      on e: EIdFTPServiceNotAvailable do
        if i=0 then
          begin
            IdFTP.Disconnect;
            IdFTP.Connect;
          end;
    end;
...ungetestet, als Anregung...

mariusbenz 14. Dez 2017 10:22

AW: IdFTP No-transfer-time exceeded
 
Danke erstmal an alle für eure Antworten.


Zitat:

Zitat von mischerr (Beitrag 1388810)
Ich würde es wahrscheinlich quick-and-dirty so lösen:
Code:
  for j:= 0 to 1 do
    try
      if IdFTP.Connected then
        begin
          IdFTP.List();
          for I := 0 to IdFTP.DirectoryListing.Count - 1 do
            begin
              [...]
            end
          [...]
          break;
        end;
    except
      on e: EIdFTPServiceNotAvailable do
        if i=0 then
          begin
            IdFTP.Disconnect;
            IdFTP.Connect;
          end;
    end;
...ungetestet, als Anregung...

Habe das jetzt mal eingebaut und das scheint zu funktionieren. Ich finde das momentan besser als alle paar Sekunden neu zu verbinden. Aber ich kenne mich mit FTP-Servern nicht aus, deshlab weiß ich nicht, ob es den mehr stört, wenn sich jemand alle paar Sekunden neu verbindet oder er einfach solange wie möglich die Verbindung aufrecht erhält.
Und bevor jemand suchen geht, der das hier liest, die Exception-Klasse "EIdFTPServiceNotAvailable" ist in der Unit "IdReplyFTP" zu finden.


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