IdFTP->Get übers Internet nicht erfolgreich



  • Hallo Community,
    Ich hab einen FTP->Server auf einem Rechner laufen.
    Auf diesen sind einige Dateien freigegeben.
    Dieser Rechner hängt an nem Router und für diesen Router ist ein DynDns angelegt.
    In dem Router (FritzBox) habe ich den Port für meinen FTP, den ich benutzte (45555) freigeschaltet.

    Nun möchte ich von zu Hause aus mit meinem geschreibenen IdFTPClient auf den Server connecten und mir diese Dateien runterladen.

    Der Connect auf den FTPserver funktioniert einwandfrei.
    Wenn ich den Dateidownload starte, dauert es eine Weile und es erscheint im Status des Clients -> Download completet
    aber der Button über den ich das gestartet habe bleibt gedrückt. Kurze Zeit später erscheint im Status "READ TIMED OUT"
    die Datei ist auf meinem Rechner hat aber 0KB anstelle von paar 900KB.

    WindowsFirewall ist auf beiden Rechnern aus?!

    void __fastcall TForm5::Button2Click(TObject *Sender)
    {
      FTP->Host         = Edit2->Text;
      FTP->Username     = Edit4->Text;
      FTP->Password     = Edit5->Text;
      FTP->Passive      = true;
      FTP->AutoLogin    = true;
      FTP->Port         = StrToInt(Edit3->Text);   / 45555
      FTP->TransferType = ftBinary;
    
      Memo1->Clear();
    
      FTP->Connect();
    }
    void _fastcall Download()
    { 
      AnsiString wStr;
      AnsiString data = "0.txt" ;
      char sa = SA;
      char se = SE;
      try
      {
    	FTP->Get(data, data, true, false);   // Syntax: Get(zu kopierende Datei, Speicherung, Überschreiben bei Vorhanden sein, Resum Datei)
      } catch (Exception &E)
      {
        Memo1->Lines->Add(E.Message);
      }
    }
    

    Jemand schon erfahrung damit gemacht`?!

    Wenn ich das ganze über Lan laufen lasse funktioniert es einwandfrei.



  • Hast du mal versucht auf das FTP-Verzeichnis via Browser zuzugreifen? Damit kannst du testen ob du auch wirklich von zu Hause aus zugreifen kannst.



  • also mit Telnet usw. zugriff funktioniert.
    aber über brwoser auf den FTP mit dem anderen Port + benutzer + passwort hab i net getestet aber rein theroretisch muss des ja alles laufen?!



  • aLeXanDer.. schrieb:

    In dem Router (FritzBox) habe ich den Port für meinen FTP, den ich benutzte (45555) freigeschaltet.

    Hast du auch den Port weitergeleitet auf dem Computer auf dem der FTP Server läuft?



  • aLeXanDer.. schrieb:

    [...] rein theroretisch muss des ja alles laufen?!

    Theoretisch. 😉
    Du solltest du erstmal sicherstellen (z.B. mit einem "professionellen" FTP-Client), dass der Server überhaupt korrekt zu erreichen ist.
    Erst dann ist ein Programmierfehler in deinem eigenen Client zu vermuten und erst dann gehört das in dieses Forum.



  • Ja da hast du recht 🙂
    entschuldigung.
    Und es stimmt, mit einem normalen FTP Client und Server kann die Verbindung auch nicht hergestellt werden, bzw. der Datentransfer



  • Lag letzendlich trotzdem in meinem Programm.

    Und zwar im IdFTPServer.

    Hier muss man, wenn man einen Passiven FTP hat im PASVReplay
    unterscheiden von wo der zugriff erfolgt und schliesslich die VIP richtig setzen.

    meine Lösung hierzu

    //---------------------------------------------------------------------------
    void __fastcall TForm6::FTPServerPASVReply(TIdFTPServerContext *ASender, UnicodeString &VIP,
              WORD &VPort, const TIdIPVersion AIPVer)
    {
      Memo1->Lines->Add("IP VIP: "+VIP);
    
      Memo1->Lines->Add("Connected from: " + ASender->Binding()->PeerIP);
      if ((ASender->Binding()->PeerIP == ASender->Binding()->IP)
    	  ||(ASender->Binding()->PeerIP == IdIPWatch1->CurrentIP))
      {
    	Memo1->Lines->Add("Connected from local computer");
    	return;
      }
      if  (ASender->Binding()->PeerIP.SubString(0,ASender->Binding()->PeerIP.LastDelimiter("."))
    		==  IdIPWatch1->CurrentIP.SubString(0,IdIPWatch1->CurrentIP.LastDelimiter(".")))
      {
    	Memo1->Lines->Add("Connected from local network");
    	return;
      }
      Memo1->Lines->Add("Connected from remote network");
      AnsiString PublicIP = GetPublicIP();
      Memo1->Lines->Add("VIP changed from " + VIP + " to " + PublicIP);
      VIP = PublicIP;
    }
    //---------------------------------------------------------------------------
    AnsiString __fastcall TForm6::GetPublicIP()
    {
      return IdHTTP1->Get("http://iplookup.flashfxp.com");  //<-- bereits richtige Url
    }
    //---------------------------------------------------------------------------
    

    ahoi



  • aLeXanDer.. schrieb:

    Und zwar im IdFTPServer.

    Die Info, dass auch der Server selbst geschrieben ist, hätte mit in das erste Posting gehört ...
    Aber nun passt es ja.



  • Ja ich ging von einem fehler im Client aus, da der Connect usw. anfangs funktionierte.

    Jetzt Stehts ja mit drin und hilft eventuell anderen 🙂


Anmelden zum Antworten