Mit WinInet FTP server auslesen



  • Hallo Liebe Community,

    ich möchte mithilfe von WinInet meinen FTP Server auslesen und alle Dateien und Ordner Downloaden.

    Dabei habe ich eine Funktion geschrieben die sich selber aufruft wenn sie einen Unterordner findet.

    Das klappt auch ganz gut beim ersten Rekursiven aufruf und manchmal auch beim zweiten jedoch alle weiteren Unterordner werden nicht mehr ausgelesen.

    Hier ein Auszug aus meinem Code

    void download(string Pfad)
    {
    
    	string adresse = "ftp-web.funpic.de";
    	HINTERNET hOpen, hConnection; 
    	hOpen = InternetOpen(0,INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    	hConnection = InternetConnect(hOpen, LPCSTR(adresse.c_str()), INTERNET_DEFAULT_FTP_PORT, "name", "password", INTERNET_SERVICE_FTP, 0, 0);
    
    	WIN32_FIND_DATA save;
    	FILETIME ft;
            ELEMENT ftp[100];
    	int pos=0;
    
    	HINTERNET hFtpfind = FtpFindFirstFile(hConnection, Pfad.c_str(),  &save, 0, 0);
    		do
    		{
    				if (!( (save.cFileName[0]=='.') && ( (save.cFileName[1]=='.' && save.cFileName[2]==0) || save.cFileName[1]==0 ) )) 
    				{ 
    					if (save.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    					{ 
    						ftp[pos].i=2;					
    					} 
    					else 
    					{ 
    						ftp[pos].i=1;
    					} 
    					ftp[pos].name=save.cFileName;
    					ft=save.ftLastWriteTime;
    					FileTimeToSystemTime(&ft , &ftp[pos].zeit);
    					ftp[pos].size=save.nFileSizeLow;
    					pos++;
    				} 
    
    		}while(InternetFindNextFile(hFtpfind, &save));
    		pos=0;	   //ELEMENTE AUF DEM FTP SERVER IM PFAD:: IN DAS ARRAY ftp[100] schreiben.
    

    Weiter unten im Programm wird die Funktion dann immer Rekursiv aufgerufen wenn ein Ordner vorhanden ist. Das klappt 2,3 mal und dann nicht mehr.

    Hoffe ihr könnt mir weiterhelfen

    Vielen Dank im Voraus

    beste Grüße



  • Hallo

    Ich bin kein Experte was FTP anbelangt, aber mit WinInet habe ich auch schon mal gearbeitet.
    Mir ist aufgefallen, dass aktive und passive Verbindungen je nach Server/Client-Konfiguration manchmal seltsame Fehler liefern können, besonders wenn mehrere Anfragen hintereinander an den Server gesendet werden (Request 1 funktioniert, Request 2 schlägt mit Timeout fehl). Generell würde ich empfehlen InternetConnect mit INTERNET_FLAG_PASSIVE aufzurufen, weil die Server dafür meist konfiguriert sind, die Clients aber oft nicht ACTIVE sein können (Firewall/Router).

    Wird ein HINTERNET für einige Zeit nicht benutzt dürfte der eingesetzte Socket geschlossen werden und die nächste Anforderung schlägt fehl. Habe mir daher damals immer eine Routine geschrieben, die bei einem Fehlschlag die Verbindung einmal neu aufbaut und es nochmals versucht.

    Beachte auch, dass WinInet bei FTP immer nur eine Aktion gleichzeitig ausführen kann. Bei Rekursionen muss die letzte Aktion abgeschlossen sein (InternetCloseHandle())!

    Ansonsten solltest du (wie bei jeder WinAPI 😃 ) darauf achten alle deine Handles zu schließen, speziell wenn durch einen Fehler/Exception ein Codeblock verlassen wird (daran bin ich schon ein paar mal hängen geblieben 😉 ).

    cu

    PS: Ich hoffe dein FTP-Verzeichnis hat NIE mehr als 100 Unterelemente ... (std::vector kann ein mächtiger Verbündeter sein)


Anmelden zum Antworten