Datei auf FTP uploaden mit STOR
-
Hallo,
Ich möchte gerne eine Datei auf meinen FTP-Server Uploaden, und zwar nur mit dem Winsock. Das Downloaden habe ich schon hinbekommen, das ist ja nicht so schwer, aber jetzt möchte ich auch was Uploaden. Hier istd er Codeschnipsel:
rc = send(s,"STOR /www/TestFile.txt\r\n", sizeof("STOR /www/TestFile.txt\r\n"), 0); rc = recv(s, in_buf, sizeof(in_buf), 0);
Ich habe vorher mich korrekt eingelogged auf dem FTP, Username und PW sind mit 230 bestätigt worden. Dann habe ich über
rc = send(s,"PASV\r\n", sizeof("PASV\r\n"), 0); rc = recv(s, in_buf, sizeof(in_buf), 0);
Den Port für die Datenübertragung angefordert und die Daten des Servers ausgewertet(Auswertung stimmt, weil ich später über den berechneten Port Downloaden kann). Ich habe nach "STOR" oben noch ein recv gesetzt weil ich davon ausgegangen bin, das der FTP-Server mir erst noch eine Bestätigung schickt, das ich mit der Datenübertragung anfangen soll. Bei recv bleibt das Programm aber immer hängen weil auf Daten vom FTP gewartet wird aber nichts kommt. Also habe ich es mal damit versucht, nach dem STOR Befehl mit dem Senden der Datei über den Datenkanal direkt loszulegen, danach ist die entsprechende Datei auch auf dem Server aber mit 0 Byte. Kann mir jemand sagen, wie ich das mit STOR richtig machen muß?
PS.: Ich möchte nicht mit irgendwelchen fertigen FTP-Komponenten arbeiten, sondern ich wollte mich mal ein bisschen in den Winsock einarbeiten und mache es deswegen damit.
-
seddto schrieb:
rc = send(s,"PASV\r\n", sizeof("PASV\r\n"), 0); rc = recv(s, in_buf, sizeof(in_buf), 0);
Den Port für die Datenübertragung angefordert und die Daten des Servers ausgewertet(Auswertung stimmt, weil ich später über den berechneten Port Downloaden kann). Ich habe nach "STOR" oben noch ein recv gesetzt weil ich davon ausgegangen bin, das der FTP-Server mir erst noch eine Bestätigung schickt, das ich mit der Datenübertragung anfangen soll. Bei recv bleibt das Programm aber immer hängen weil auf Daten vom FTP gewartet wird aber nichts kommt. Also habe ich es mal damit versucht, nach dem STOR Befehl mit dem Senden der Datei über den Datenkanal direkt loszulegen, danach ist die entsprechende Datei auch auf dem Server aber mit 0 Byte. Kann mir jemand sagen, wie ich das mit STOR richtig machen muß?
hallo seddto,
ich kenne mich leider nicht 100% mit der materie aus... allerdings denke ich das durch dein "PASV" ( passive ) dem FTP server ja mitgeteilt wird das er auf deine kommandos lauschen soll ( der server sich also mehr im hintergrund hält und du ihm sagst was er machen soll )... und er deshalb nichts returned weil du ihm nach "STOR" den Dateinamen gefolgt vom inhalt der datei übermitteln sollst !!!
mit anderen worten der FTP server antwortet nicht... weil er auf den inhalt dieser datei wartet !!!
ciao veganza
p.s. du wirst doch noch etwas in das FTP RFC einlesen müßen um zu verstehen welchen ablauf du einhalten mußt !!! versuche doch einfach mal den netzwerkverkehr zu snoopen ( z.B. mit dem freeware tool ethereal ) wenn du mit einem "richtigen" FTP client eine datei auf deinen FTP server überträgst !!!
-
Ja das RFC habe ich mir schon angeschaut, aber irgendwie werde ich nicht so ganz schlau daraus - ist halt doch recht komplex. Deshalb wäre es vielleicht am besten wenn jemand einen kurzen Beispielcode hätte, oder es kurz erklären könnte, denn so versteht man es dann meistens am besten.
-
Hmm... seltsame angelegenheit. Also ich habs vor kurzem auch mal implementiert und bei mir siehts so aus:
PASV
-> Antwort lesen
if (Read) RETR
else STOR
Datenverbindung öffnen
-> Antwort lesen // Eigentlich irgendwie ne komische reihenfolge, aber hier scheints zu funktionieren;)Der einzige sonstige unterschied wäre noch, das ich das verzeichnis explizit wechsle und dann mit relativen Pfaden arbeite, aber daran sollte es eigentlich auch nicht liegen.
-edit-
Hm... faszinierend. Ich habe jetzt mal testhalber die Abfrage der Antwort vor das öffnen der datenverbindung gesetzt und dann funktioniert es nicht mehr. (getestet mit RETR).
-edit-
-
Ja ich habe auch langsam das gefühl, das der Server von mir noch eine Meldung erwartet, das mein Datentransfer jetzt beendet ist und er die Datei jetzt schreiben kann. Ich meinen Code schon in den verschiedensten Kombinationen getestet, hier mal ein Beispiel:
rc2=connect(s2,(SOCKADDR*)&addr2,sizeof(SOCKADDR)); // 2.Socket für Data Connection -> rc2 = 0 Also Verbindung steht! rc = send(s,"STOR /www/Test.txt\r\n", sizeof("STOR /www/Test.txt\r\n"), 0); // STOR über die Komandoverbindung senden rc = recv(s, in_buf, sizeof(in_buf), 0); // Anwort vom Server: 150 Data Connection accepted, starting transfer int i = 1; int j; //Datei die gesendet werden soll steht in der Variable Datenneu while(i < (Datenneu.length() - 256)) { //Immer nur 256 Zeichen aufeinmal senden for(j= 1; j < 256; j++) { //out_buf = char out_buf[j] = Datenneu[i]; i++; } // und abschicken rc2 = send(s2,out_buf, sizeof(out_buf), 0); } //Hier fehlt noch irgendwie von mir eine Meldung, das die Daten komplett übertragen wurden und der ftp sie jetzt in die Datei schreiben kann
Am Ende ist die Datei in dem entsprechenden Verzeichnis auf dem FTP vorhanden, hat aber immer eine Größe von 0 Byte
-
hast du mal versucht, die datenverbindungverbindung erst nach dem STOR command zu öffnen?
-
Ja hab ich jetzt gerade mal gemacht, daran liegt es nicht. Wenn ich mit RETR runterlade öffne ich die Datenverbindung auch vor dem RETR und das klappt auch
Weiss echt langsam nicht mehr weiter. Weiss denn wirklich niemand mit welchen Einzelschritten ich das STOR ausführen muss?
//edit: Vielleicht mache ich ja auch beim Senden der Datei etwas falsch?? Müssen die Daten irgendwie besonders formatiert sein, damit der FTp sie in die Datei schreibt, zum Beispiel wie bei den anderen FTP-Kommands ein \r\n um das Ende der Übertragung zu kennzeichnen?