Autor Beitrag
T.E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
BeitragVerfasst: Fr 12.11.10 14:14 
Moin moin,

mich plagen gerade zwei Probleme. Und zwar habe ich ein Programm geschrieben das FXP Transfers via Thread erledigt/erledigen soll.
Soo Problem eins:
Wenn ich einen Transfer anschiebe so wird dieser manachmal nach einer Minute abgebrochem beide senden ohne Grund einen QUIT Befehl aus.
Hier die Logausschnitte aus Quellserver:
ausblenden Quelltext
1:
2:
3:
4:
5:
Sent 12.11.2010 12:55:14: PASV<EOL>
Recv 12.11.2010 12:55:14: 227 Entering Passive Mode (172,20,64,37,118,239)<EOL>
Sent 12.11.2010 12:55:14: RETR E01105.mxf<EOL>
Recv 12.11.2010 12:55:14: 150 Opening BINARY mode data connection for E01105.mxf (2979111936 bytes).<EOL>
Sent 12.11.2010 12:56:14: QUIT<EOL>

und der aus dem Zielserver:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
Sent 12.11.2010 12:55:14: PORT 172,20,64,37,118,239<EOL>
Recv 12.11.2010 12:55:14: 200 PORT command successful<EOL>
Sent 12.11.2010 12:55:14: STOR E01105.mxf<EOL>
Recv 12.11.2010 12:55:14: 150 Opening data connection.<EOL>
Sent 12.11.2010 12:56:14: QUIT<EOL>
Recv 12.11.2010 12:56:14: 221 Be seeing you.<EOL>

Wenn ich nun aber ein anderes File nehme, so kann es sein, das der Transfer ordnungsgemäß durchgeführt wird oder aber wie oben halt wieder fehlschlägt.

Kennt da jemand eine Lösung oder das Problem?

Problem nummer 2 ist:
Ich bekomme egal wie der Transfer ausgeht immer die Meldung Dateiupload fehlgeschlagen wieder! Auch wenn das File ordnungsgemäß und vollständig übertragen wird (auch der FTP Server stimmt mir zu das das File richitg und vollständig angekommen ist).
Für den Thread habe ich folgenden Code als Vorlage verwendet und nur angepasst da ich ja direkt FXP Transfers mache und entsprechend kein Lokales Verzeichnis etc habe. www.delphipraxis.net...indy-als-thread.html

Kennt auch da jemand des Rätsels Läsung?
Hier der Code des Transfers im Ausschnitt:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
//In der Zeit des Sendens ist kein Zugriff auf die Fileliste möglich!!!
          Semaphore.Acquire;

          //Alle Dateien aus der Dateiliste senden
          //jedes Mal Terminate abfragen
          for cnt := 0 to FileList.Count -  1 do
            if (not Self.Terminated) then
            begin
              WriteLog(2,'Starte Upload');
              Inc(IFileCnt);
              IState := ftpUPLOADING;

              //FXP TEXT QUELLCODE - QUELLECODE WIRD VERSCHOBEN
              //wechsle in Verzeichnis
              //IState := ftpCHANGEDIR;
              WriteLog(1,'Wechsel in das Quellverzeichnis ' + Config.ArbeitsVerzeichnis_Quelle);
              FTP_Quelle.changedir(Config.Arbeitsverzeichnis_Quelle);
              FTP_Quelle.sendcmd('PASV');

              //Bereinige die Rückmeldung auf den letzten Befehl (PASV) an MediaGrid von
              //nicht benötigten Zeichen, die zu Fehler führen.
              port := '';
              port := Copy(Trim(FTP_Quelle.lastcmdresult.text.Text), 24, MaxInt);
              Delete(port,length(port),2);
              FTP_Ziel.sendcmd('PORT ' + port);
              WriteLogTransfer(8,'Beginne Transfer von "' + Filelist[cnt] + '" nach ' + Config.Hauptverzeichnis_Ziel + Config.Arbeitsverzeichnis_Ziel);
              FTP_Ziel.sendcmd('STOR ' + Filelist[cnt]);
              FTP_Quelle.sendcmd('RETR ' + Filelist[cnt]);

              FTP_Ziel.GetResponse([110125150]);
              FTP_Quelle.GetResponse([110125150]);
              FTP_Ziel.GetResponse([225226250]);
              FTP_Quelle.GetResponse([225226250]);

              WriteLog(2,'Transfer von "' + Filelist[cnt] + '" abgeschlossen');

            end;

            //wenn wir hier ankommen war der gesamte Upload ok
            //die Fileliste wird gelöscht
            IState := ftpREADY;
            WriteLogTransfer(9,'Transfer von "' + Filelist[cnt] + '" nach ' + Config.Hauptverzeichnis_Ziel + Config.Arbeitsverzeichnis_Ziel + ' erfolgreich abgeschlossen');
            WriteLogTransfer(9,'TEST');
            Filelist.Clear;
        finally
          FTP_Quelle.Disconnect;
          FTP_Ziel.Disconnect;
          Semaphore.Release;
          Self.HasJob := False;
          Self.Suspend;
        end;


Besten Dank und viele Grüße!

_________________
Schöne Grüße,
Torben
T.E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
BeitragVerfasst: Di 23.11.10 16:45 
Nach langem suchen habe ich den Fehler gefunden:

Und zwar ist der verursacher der ReadTimeout der IdFTP. dieser ist standardmäßig auf 60000 gesetzt und bei großen Files wird der Timeout erreicht da es sich bei FXP um eine abgewandelte Art von FTP handelt.

also einfach den ReadTimeout z.B. auf 0 für unendlich oder höher 60000 setzen.

_________________
Schöne Grüße,
Torben