FTP mit Sockets
-
Ich habe jetzt eine Verbindung mit einem C-Clienten zu meinem FTP-Server aufgebaut. USER, PASS usw. funkt aber wenn ich STOR einsetzte + der datei im gleichen verzeichnis, dann ladet er eine leere datei hoch... ich denke es liegt am PASV.. wenn ich aber PASV ausführen möchste gibt er mir eine IP Nummer zurück + ich glaub denn Port denn man errechnun müsste... aber wenn ich dann STOR ausführen mag, kommt ein timeout...
warum??mfg Takeru
-
hat keiner eine Antwort?
mfg Takeru
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
wiso hat keiner eine antwort
-
Weil du die Frage so schlecht gestellt hast.
-
Ok. Wenn du meinst das ich sie schlecht gestellt ist versuch ich es noch einmal.
Mit Sockets habe ich eine Verbindung zu meinem FTP Server hergestellt. Ich will mit dem Clienten .txt Datein hochladen. Das heißt ich muss PASV starten oder? Ich beschreibe mal den Ablauf:
Also er startet Winsock, er erstellt ein Socket und dann verbindet er mit dem FTP Server. Dann gibt er schon vorprogrammierte Befehle ein. Jetzt sendet er mir eine Nachricht das alles klar ist. Damit nicht alles durcheinander wird, kommt die Nachricht in den ersten Ablauf. Im zweiten Ablauf kommt dann der erste Befehl von mir. Damit ich mich als Benutzter des FTP-Server identifizieren muss ich mich also mit USER und PASS einlogen, oder? Also im zweiten Ablauf gib ich den Befehl USER. Im dritten Ablauf PASS und dann schickt der Server mir das ich mich eingelogt habe. Jetzt möchte ich die Datei hochladen. Deswegen starte ich PASV. Ich bekomm eine IP Nummer + Port zurück, wobei man sich den Port errechnen muss. Wie man denn Port errechnet habe ich von hier.http://www.supernature-forum.de/netzwerke-and-server/6222-knowhow-was-ist-pasv.htmlWenn ich dann jetzt die Datei hochladen will, also STOR, dann kommt nach einiger Zeit, wie erwartet ein timeout. Wenn ich jetzt aber PASV herausschneide, dann ladet er nichts hoch, erstellt jedoch die Datei am Server mit dem Namen den ich angegeben habe.
Wie schaffe ich es jetzt, dass ich die Datei mitsamt Inhalt hinauflade?
Hier der Log meines Clienten und die Quelldatei des Clienten:
Log:
Winsock gestartet! Socket erstellt! Verbunden mit FTp-Server! Befehl: connection Antwort: 220 Welcome. FTP Server ready. Befehl: USER xxxtrayxxx Antwort : 331 Password required for xxxtrayxxx Befehl PASS geheim Anwort: 239 User xxxtrayxxx logged in Befehl: PASV Antwort: 227 Entering Passiv Mode (213,202,225,76,236,103) Befehl: STOR test.TXT Antwort 421 Idle timeout (120 seconds): closing control connection Durch druecken von Enter schliesst das Programm....
***********************************************************************************************
Quellcode:#include <windows.h> #include <winsock2.h> #include <stdio.h> #include <iostream> #include <string> using namespace std; int startWinsock(void); int main() { long rc; SOCKET s; rc=startWinsock(); SOCKADDR_IN addr; if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); getchar(); return 1; } else { printf("Winsock gestartet!\n"); } s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); getchar(); return 1; } else { printf("Socket erstellt!\n"); } memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(21); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr("213.202.225.76"); // zielrechner ist unser eigener rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); getchar(); return 1; } else { printf("Verbunden mit FTP-Sever..\n"); } char buf1[256] = "Connection\n"; cout << "\n1:\nBefehl: \t" << buf1 << "Antwort: \t"; rc=recv(s,buf1,256,0); buf1[rc]='\0'; printf("%s", buf1); /* ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ char buf2[] = "USER xxxtrayxxx\n"; cout << "\n2:\nBefehl: \t" << buf2 << "Antwort: \t"; send(s,buf2,strlen(buf2),0); rc=recv(s,buf2,256,0); buf2[rc]='\0'; printf("%s", buf2); /* ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ char buf3[] = "PASS geheim\n"; cout << "\n3:\nBefehl: \t" << buf3 << "Antwort: \t"; send(s,buf3,strlen(buf3),0); rc=recv(s,buf3,256,0); buf3[rc]='\0'; printf("%s", buf3); /* ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ char buf7[] = "PASV\r\n"; cout << "\n7:\nBefehl: \t" << buf7 << "Antwort: \t"; send(s,buf7,strlen(buf7),0); rc=recv(s,buf7,256,0); buf7[rc]='\0'; printf("%s", buf7); /* ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ char buf10[] = "STOR test.TXT\n"; cout << "\n10:\nBefehl: \t" << buf10 << "Antwort: \t"; send(s,buf10,strlen(buf10),0); rc=recv(s,buf10,256,0); buf10[rc]='\0'; printf("%s", buf10); /* ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ cout << "\n\n\n\nDurch druecken von Enter schliesst sich das Programm...."; closesocket(s); WSACleanup(); getchar(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
Es sind deshalb soviele getchar() drinnen damit ich den Ablauf genauer besichtigen kann.
Mit freundlichen Grüßen
Takeru
-
lies mal das: http://www.windowsnetworking.com/articles_tutorials/Understanding-FTP-Protocol.html
besonders diese stelleOne of the connections opened by the client will contact the FTP server on port 21, and issue it the PASV (passive) command, vice the normal PORT command when using active FTP. Now what happens is that the FTP server opens an ephemeral port and issues the PORT command to the FTP client. With this in hand the client then starts a connection back to the server port for the data transfer.
-
Ich hab versucht mit denn schlechten übersetztungen von Google und meinen schlechten Englisch Kentnisse diese Seite zu lesen. Ich mach doch PASV. Ahh ich versteh das nicht... fehlt vorher noch irgendwas?
Dannach kann ich doch nichts mehr machen... Un in meinem SmartFTP-Clienten steht folgender Log:
[12:53:37] 220 Welcome. FTP Server ready. [12:53:37] USER xxxtrayxxx [12:53:37] 331 Password required for xxxtrayxxx [12:53:37] PASS (hidden) [12:53:37] 230 User xxxtrayxxx logged in [12:53:37] SYST [12:53:37] 215 UNIX Type: L8 [12:53:37] Detected Server Type: UNIX [12:53:37] FEAT [12:53:37] 211-Features: [12:53:37] MDTM [12:53:37] REST STREAM [12:53:37] SIZE [12:53:37] 211 End [12:53:37] PWD [12:53:37] 257 "/" is the current directory [12:53:37] TYPE A [12:53:37] 200 Type set to A [12:53:37] PASV [12:53:37] 227 Entering Passive Mode (213,202,225,76,175,8). [12:53:37] Opening data connection to 213.202.225.76 Port: 44808 [12:53:37] LIST -aL [12:53:37] 150 Opening ASCII mode data connection for file list [12:53:38] 370 bytes transferred. (4,69 KB/s) (77 ms) [12:53:38] 226 Transfer complete
Da steht Opening data connection to 213.202.225.76 Port: 44808
Ist das vielleicht ein "Versteckter Befehl?" Weil die Zeile kommt vom Clienten(bemerkt man an der Farbe).EDIT:
Muss ich vielleicht einen extra Clienten schreiben? Der mit dieser IP Nummer und Port verbindung sucht?
-
Ich verstehe nicht viel von FTP und rate einfach mal völlig ins Blaue: Kann es sein, dass der FTP-Server nach deinem Senden von
Befehl: STOR test.TXT
erwartet, dass du den Inhalt der Datei sofort hinterherschickt?
-
ich hab jetzt denn PORT und nun?
-
Takeru schrieb:
ich hab jetzt denn PORT und nun?
Verbindung aufbauen und Datei dort hin senden. Wie genau, musst du halt nachlesen.
-
wieder mit
srv.sin_addr.s_addr = inet_addr("89.163.146.131");
srv.sin_port = htons((unsigned short int) atol("21"));
srv.sin_family = AF_INET;
?
-
Ja.