Problem mit FtpCommand() und dem Ftp Kommando "MDTM"



  • Hallo,
    ich möchte das letzte Änderungsdatum einer Datei auf dem FTP-Server herausfinden.

    Ich habe folgendes Programm:

    char* benutzername = "benutzername";
    	char* passwort = "*****************";
        char* server = "server.srv";
    	char* kommando = "MDTM Demo.7z";
        DWORD_PTR kontext = 0;
        HINTERNET phFtpCommand = NULL;
        HINTERNET hiOpen = NULL;
        HINTERNET hiConnect = NULL;
    	char antwort[1024];
    	char ausgabeStr[1024];
    	DWORD gelesen;
    
        hiOpen = InternetOpenA("Mein_Programm",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
        if(!hiOpen){MessageBoxA(NULL,"InternetOpen fehlgeschlagen","",MB_OK);}
        hiConnect = InternetConnectA(hiOpen,server ,INTERNET_DEFAULT_FTP_PORT,benutzername,passwort,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,kontext);
        if(!hiConnect){MessageBoxA(NULL,"InternetConnect fehlgeschlagen","",MB_OK);}
    
    	//######################################################################################
    
        if(!FtpCommandA(hiConnect,true,FTP_TRANSFER_TYPE_BINARY,kommando,kontext,&phFtpCommand))
        {
            DWORD länge = 1024;
            DWORD fehler;
            char fehlerStr[1024];
            InternetGetLastResponseInfoA(&fehler,fehlerStr,&länge);
            MessageBoxA(NULL,fehlerStr,"",MB_OK);
        }
    
        gelesen = 0;
        if(!InternetReadFile(phFtpCommand,antwort,1024,&gelesen))
        {
            DWORD länge = 1024;
            DWORD fehler;
            char fehlerStr[1024];
    
            sprintf(fehlerStr,"GetLastError(): %d",GetLastError());
            MessageBoxA(NULL,fehlerStr,"InternetReadFile",MB_OK);
    
            InternetGetLastResponseInfoA(&fehler,fehlerStr,&länge);
            MessageBoxA(NULL,fehlerStr,"InternetReadFile",MB_OK);
        }
        sprintf(ausgabeStr,"gelesen: %d\n\n%s",gelesen,antwort);
        MessageBoxA(NULL,ausgabeStr,"",MB_OK);
    	InternetCloseHandle(phFtpCommand);
    
        FtpCommandA(hiConnect,false,FTP_TRANSFER_TYPE_BINARY,"QUIT",kontext,NULL); 
    	InternetCloseHandle(hiConnect);
    	InternetCloseHandle(hiOpen);
    

    Allerdings bekomme ich nach einer Weile nur die Meldung

    GetLastError(): 12002
    

    Das steht für ERROR_INTERNET_TIMEOUT.

    Gelesen werden von InternetReadFile() 0 Bytes und der Puffer bleibt daher natürlich leer.

    An der Verbindung selbst liegt es nicht glaube ich, denn das Kommando "LIST" liefert mir tatsächlich eine Auflistung aller Dateien, die in dem Verzeichnis auf dem FTP-Server sind. Selbst das Kommando "LIST Demo.7z" geht - da enthält die Liste eben nur die eine Datei.

    Unser Server ist wohl nicht das Problem, denn mit dem FileZilla Client kann ich einen benutzerdefinierten Befehl senden und da funktioniert es.

    Muss ich vor MDTM vielleicht noch andere Kommandos schicken damit das funktioniert? Oder wieso geht das nicht?



  • Also ich fühle mich da ziemlich ungebunden.

    Die Frage ist: Wie bekomme ich das letzte Änderungsdatum einer Datei auf dem FTP. Bin für alle Vorschläge offen.



  • Ich habe jetzt den Netzwerk-Verkehr mit WireShark aufgezeichnet und angeschaut.

    Ich habe jetzt mal folgendes Programm:

    #include <tchar.h>
    #include <Windows.h>
    #include <Wininet.h>
    #include <stdio.h>
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char* benutzername = "**************";
    	char* passwort = "**************";
        char* server = "**************";
    	char* kommando = "MDTM Demo.7z";
        DWORD_PTR kontext = 0;
        HINTERNET phFtpCommand = NULL;
        HINTERNET hiOpen = NULL;
        HINTERNET hiConnect = NULL;
    	char antwort[1024];
    	char ausgabeStr[1024];
    	DWORD gelesen = 0;
    
        hiOpen = InternetOpenA("FTP_Downloader",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
        if(!hiOpen){MessageBoxA(NULL,"InternetOpen fehlgeschlagen","",MB_OK);}
        hiConnect = InternetConnectA(hiOpen,server ,INTERNET_DEFAULT_FTP_PORT,benutzername,passwort,INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,kontext);
        if(!hiConnect){MessageBoxA(NULL,"InternetConnect fehlgeschlagen","",MB_OK);}
    
    	//######################################################################################
        if(!FtpCommandA(hiConnect,true,FTP_TRANSFER_TYPE_ASCII,kommando,kontext,&phFtpCommand))
        {
            DWORD länge = 1024;
            DWORD fehler;
            char fehlerStr[1024];
            InternetGetLastResponseInfoA(&fehler,fehlerStr,&länge);
            MessageBoxA(NULL,fehlerStr,"",MB_OK);
        }
        gelesen = 0;
        if(!InternetReadFile(phFtpCommand,antwort,1024,&gelesen))
        {
    		DWORD fehler;
    		DWORD länge = 1024;
            char fehlerStr[1024];
    	    InternetGetLastResponseInfoA(&fehler,fehlerStr,&länge);
    
    		printf("GetLastError(): %d\n",GetLastError());
    		printf("fehler: %d\n",fehler);
    		printf("länge: %d\n",länge);
    		printf("fehlerStr:\n%s",fehlerStr);
        }
    	InternetCloseHandle(phFtpCommand);
    	//######################################################################################
    
    	antwort[gelesen-1] = 0;
        printf("gelesen: %d\n",gelesen);
    	if(gelesen>0)
    	{
    		printf("antwort:\n%s",antwort);
    	}
    
    	if(!FtpCommandA(hiConnect,false,FTP_TRANSFER_TYPE_BINARY,"QUIT",kontext,NULL)) 
    	{
            DWORD länge = 1024;
            DWORD fehler;
            char fehlerStr[1024];
            InternetGetLastResponseInfoA(&fehler,fehlerStr,&länge);
            MessageBoxA(NULL,fehlerStr,"",MB_OK);
        }
    
    	InternetCloseHandle(hiConnect);
    	InternetCloseHandle(hiOpen);
    
    	system("pause");
    	return 0;
    }
    

    Die Konsole liedert folgende Ausgabe:

    GetLastError(): 12002
    fehler: 0
    lõnge: 0
    fehlerStr:
    gelesen: 0
    Drücken Sie eine beliebige Taste . . .
    

    Und in WireShark finde ich unter "Follow TCP Stream" mit dem Filter "FTP" folgendes Log:

    220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
    220-You are user number 4 of 50 allowed.
    220-Local time is now 11:50. Server port: 21.
    220-IPv6 connections are also welcome on this server.
    220 You will be disconnected after 10 minutes of inactivity.
    USER **************
    331 User ************** OK. Password required
    PASS **************
    230 OK. Current restricted directory is /
    TYPE A
    200 TYPE is now ASCII
    PASV
    227 Entering Passive Mode (***,***,***,***,***,***)
    MDTM Demo.7z
    213 20111128090556
    QUIT
    221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
    221 Logout.
    

    Im WireShark-Log sieht man, dass sowohl das Kommando MDTM Demo.7z als auch die Antwort "213 20111128090556" über die Leitung gegangen ist.

    Scheinbar liegt das Problem am Abgreifen dieser Antwort in meinem Programm. Wie ihr seht, mache ich das mit InternetReadFile(), wie bei den anderen Kommandos auch. Es gibt Kommandos wie "LIST" (einfach in Zeile 10 eintragen), wo das auch funktioniert.

    Ist das mit InternetReadFile() etwa falsch? Ich wüsste jetzt nicht mit welcher Funktion ich die Antwort sonst auslesen sollte...

    Kennt sich denn niemand damit aus?



  • Also wenn ich da jetzt nicht was falsch verstanden habe und ich das richtig implementiert habe, dann scheint wohl die Funktion FtpCommand() oder InternetReadFile() einen Fehler zu haben.

    Ich habe es jetzt selber implementiert. Ich baue eine Socket-Verbindung zum FTP-Server auf, schicke die entprechenden Kommandos und erhalte dann auch das Änderungsdatum der Datei. Also am Netzwerk oder am FTP-Server kanns nicht liegen...

    MfG



  • Bitte eben geposteten Beitrag nicht freischalten, da waren noch Passwörter drin!


Anmelden zum Antworten