Kann nicht mit FTP Client paludern



  • Hi, hab echt keine ahnung kann mir denn keier dass erklären bin nicht so fit in English ^^



  • /015 bedeutet wenn ich das richtig gelesn habe string-ende
    /040 -leerzeichen

    abc\377\377def\015\377\376\012\012 - das ist ein telnet string

    weiter habe ich jetzt nicht geguckt, habe nur kurz überflogen...



  • Hi, Danke mich nimmt es aber noch wunder wiso ich dazu so einen langen befehl brauche oder geht das auch noch kürzer ??



  • solche komischen strings braucht man nicht



  • Hi, so wird dass gesnedet wass ich will

    send(s,"200 Wilkommen Server Ready\012",55,0);

    Der Client nimmt den Text an und gibt ihn aus, aber antwortet nich.

    💡 Und noch ne wichtige Frage wass soll das \012, ohne dass wird der Text vom Client nicht angenommen und ausgegeben 😮



  • 012 == '\n'



  • Das ist ein Seperator, durch den der FTP-Server weiß, dass das ein String ist, und das er dort zuende ist...



  • Den "telnet-strings"-Abschnitt ist in meinen Augen eigentlich nicht wirklich wichtig ?

    Interessanter ist weiter unten:

    A request is a string of bytes. It contains
    1. a verb consisting of alphabetic ASCII characters;
    2. optionally, a space followed by a parameter; and
    3. \015\012.

    \015\012 - wenn ich mich nicht irre entspricht das \r\n (Zeilenumbruch)

    Außerdem steht da:

    Some clients fail to include the \015, so I recommend that servers look only for \012. The parameter cannot contain \012.

    Du solltest den Befehl als FTP-Server also mit \015 und \012 abschließen, aber beim schreiben eines Clients nur auf \012 achten...



  • Hi, jetzt bin ich schon ein wenig weiter gekommen,

    [R] Verbinde zu localhost -> DNS=localhost IP=127.0.0.1 PORT=21
    [R] Verbunden mit localhost
    [R] 200 Wilkommen Server Ready
    [R] USER Root
    

    Danch sende ich:

    send(s,"331 Password required for Root\012",55,0);
    

    Danach antworted der Client aber leider nicht mehr 😞



  • Wie kommst du auf die 55 ?
    (statt zu zählen könntest du da auch z.B. mit strlen() arbeiten für den 3. Parameter von send()...)



  • Hab jetz die richtige strlen genommen, funktioniert aber trozdem nicht hier mal der gesammte SourceCode 🙄

    #include <iostream>
    #include <windows.h>
    #include <winsock.h>
    
    using namespace std;
    
    int main()
    {
    	WSADATA ws;
    	SOCKET s;
    	SOCKET ac;
    	SOCKADDR_IN addr;
    	int emp_in;
    	char username[100];
    	char Password[100];
    	char out[600];
    
    	WSAStartup(MAKEWORD(2,0),&ws);
    
    	ac = socket(AF_INET,SOCK_STREAM,0);
    
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(21);
    	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    
    	bind(ac,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
    	listen(ac,10);
    
    	cout << "Auf FTP Verbindung warten" << endl;
    
    	s=accept(ac,NULL,NULL);
    
    	cout << "Neue Verbindung." << endl;
    
    	send(s,"200 Wilkommen Server Ready\012",30,0);
    
    	emp_in = recv(s,username,100,0);
    	username[emp_in+1] = '0';
    
    	send(s,"331 Password required for Root\012",35,0);
    
        emp_in = recv(s,Password,100,0);
    
    	Sleep(10000000);
    
    }
    


  • Hat den Keiner Ahnung ?? 😮



  • Du musst checken dass recv() auch das '\n' eingelesen hat 😉

    Wenn du erstmal nur testen willst, ob du die befehle richtig sendest und die Befehle vom Client erstmal ignorieren möchtest, kannst du auch alternativ erstmal VOR die recv()-Funktionsaufrufe sleeps setzen in der Hoffnung das in der zwischenzeit der kram den der ftp-client deinem server sendet auch komplett im buffer ist und von recv() in einem rutsch abgerufen werden kann 😉
    Aber: Das wäre Frickelei und allerhöchstens zu testzwecken geeignet!

    Wichtig:
    nicht alles was der client sendet kommt auch sofort bei recv() an!
    Vor allem bei lahmen Leitungen (aber auch bei lokalen verbindungen) kommt es schonmal vor das recv() mehrmals aufgerufen werden muss und der jeweiles von recv() befüllte buffer selbst zu einem ganzen zusammengebaut werden muss!



  • Der FTP Server erkennt die Befehler leider gar nicht, nur die Wilkommens Message wird erkannt die 2. Nicht 😞



  • jo, ich vermute halt das dein recv() zu früh zurückkehrt und noch gar nicht alles vom client eingelesen hat und direkt die zweite nachricht ("331 ..." dem client sendet, welcher das ignoriert weil er mit senden des Benutzernamens noch gar nicht fertig ist.

    (Außerdem solltest du als Server die Befehle mit \015\012 abschließen)

    Abgesehen davon ist \012 nur ein Zeichen (Der Schrägstrich hat eine besondere Bedeutung!) und dein 3. Parameter stimmt daher nur fast 😉



  • 127.0.0.1 schrieb:

    emp_in = recv(s,username,100,0);
    	username[emp_in+1] = '0';
    

    Hier könntest du eine Schleife einbauen, falls recv 0 zurückgibt. Das würde sicherstellen, dass du auch sicher etwas empfängst!

    Ich programmier auch grade was mit Sockets und so. Da hab ich immer einen Thread laufen, der angekommene Daten abfängt. Je nach Nachricht ruft der Thread eine entsprechende Funktion mit den gesendeten Daten als Parameter auf.
    Du könntest dir ne Status-Variable machen, die du kurz vor dem Senden des "31 Password required for Root\012" auf TIME_TO_RECEIVE_PASSWORD oder so setzt. Wenn der Nachrichten-Thread seine nächste Nachricht bekommt, ruft der eine Funktion "OnPasswordArrival" auf.
    Nur so ne Idee, will ja auch nicht, dass du dein Programm unnötig verkomplizierst!


Anmelden zum Antworten