FTP - Befehl put wird nicht verstanden



  • Hallo!!

    Ich schreibe grad in C++ einen kleinen Konsolen-FTP-Client!!

    Klappt soweit ganz gut, nur dass der Server den Befehl "put" nicht
    versteht!!

    Mit den Befehlen "user" und "pass" einloggen, hat funktioniert!
    Auch der Befehl "quit" wird verstanden!!

    Aber alle anderen FTP-Befehle, die ich im Netz gefunden hab (put, dir, ascii,get...), werden nicht verstanden.

    Ich übersende dem Server per TCP den String "put\n", aber er antwortet nur wie folgt:

    http://www.dmgames.de/FTP.JPG

    Ich weiß nicht warum, und hoffe, es kann mir jemand helfen!!



  • Vielleicht ist was Falsch im Code kannst du den hier mal posten? 😕



  • Hm, der Server antwortet mir ja, also ist ja eigentlich alles korrekt!!
    Aber hier der Code:

    //Komunikation mit dem Server
    
    	//Benutzer anmelden
    	if(!FTPCommand(clientsocket,"user v149109\n"))
    	{
    		closesocket(clientsocket);
    		return false;
    	}
    
    	//Kennwort
    	if(!FTPCommand(clientsocket,"pass xxxx\n")) 
    	{
    		closesocket(clientsocket);
    		return false;
    	}
    
    	//Datei raufputten
    	if(!FTPCommand(clientsocket,"put c:\\boot.ini\n")) 
    	{
    		closesocket(clientsocket);
    		return false;
    	}
    
    	//Close
    	if(!FTPCommand(clientsocket,"quit\n")) 
    	{
    		closesocket(clientsocket);
    		return false;
    	}
    
    bool FTPCommand(SOCKET clientsocket,char* command)
    {
    	int result;
    	char buffer[256];
    
    	//Senden
    	result = send(clientsocket,command,strlen(command),0);
    	if(result <= 0) return false;
    
    	//Empfangen
    	result = recv(clientsocket,buffer,255,0);
    	if(result <= 0) return false;
    
    	//Antwort ausgeben
    	buffer[result]='\0';
    	printf("\n%s\n",buffer);
    
    	return true;
    }
    


  • liegt wohl daran, dass es in FTP keinen PUT-Befehl gibt.

    Ausserdem sagt dir ja schon der Server, dass er PUT nicht kennt.
    Auch der Fehlercode 500 sagt aus, dass ein Syntaxfehler oder unbekannter Befehl vorliegt.

    schau mal hier: http://www.nsftools.com/tips/RawFTP.htm

    STOR ist eher das, was du brauchst.

    Hilft aber nix, nur den lokalen Pfad zu senden.
    Stattdessen wird der Dateiname mitgesendet, wie die Datei auf dem Server heissen soll.
    Im Anschluss daran wird eine Datenverbindung hergestellt
    (entweder aktiv Modus mit PORT Befehl: Server verbindet sich zum Client von Port 20 aus,
    oder passiver Modues mit PASV-Befehl: Client verbindet sich ein zweites Mal mit dem Server an einen Port, den er vom Server mitgeteilt kriegt.)

    Über diese Datenverbindung wird dann der Dateiinhalt gesendet.

    In dem Zusammenhang könnte auch noch REST von Interesse sein,
    um Uploades (oder auch Downloads) von einer bestimmten Position aus fortzusetzen, z. B. nach einer Verbindungsunterbrechung



  • Ah, das wirft Licht ins dunkel!!

    Weißt du zufällig ein Tutorial in der Richtung?? ich finde keins!!

    Also mit STOR lege ich den Remotefilename fest!!

    Anschließend sende ich ein PASV, lese den Port aus, und dann?

    Muss ich die Dateiübertragung zu diesem Port zu Fuß machen?
    Sprich, Datei öffnen, und Text übertragen??

    Danke



  • Genau:

    1. PASV senden
    2. Port auslesen (+ ip) [Format beachten: die Bytes sind Dezimal-codiert; näheres siehe Link vom Beitrag oben]
    3. Neue Verbindung (=Datenverbindung) zum ausgelesenen Port aufbauen, Dateiinhalt senden und Datenverbindung schließen.

    Tutorial kenn ich leider keins.
    Aber schau dir mal ethereal (oder einen
    beliebigen anderen Sniffer) an.

    Einfach mal aufzeichnen und analysieren, was andere FTP-Clients so treiben.
    Auch die Logfenster von FTP-Programmen (z. B. Filezilla) geben ein paar Hinweise.

    Wenn du's ganz genau wissen willst, dann kommst du vermutlich am RFC 959 nicht vorbei.
    RFC's sind aber (zumindest für mich) ned wirklich verständlich 😕

    mfg
    Martin



  • Gut, dann probier ichs so mal!!

    Vielen Dank!!



  • So, habs hinbekommen!!

    Allerdings nur mit ner kleinen Änderung:

    Man muss erst die Datei übertragen und erst dann den STOR-Befehl senden!


Anmelden zum Antworten