Kann nicht mit FTP Client paludern



  • Ich glaube, du solltest dich mal etwas eingehender mit FTP-Protokollen beschäftigen. Und das Sleep(1000000000) am Ende deines Programmes hat auch keinen Sinn.
    UND: Es kommt etwas zustande, aber nicht "zu schtande"!!! Sry aber hat mich aufgeregt 😉



  • Hi, habe mich mit dem Beschäftigt was ich bei googel gefunden habe, und da hab ich bloss herausgefunden dass ich zuerst folgendes senden muss

    220 Willkommen auf meinem FTP!

    Vieleicht kennst du je eine gute site 🙂



  • Hab mich noch nie mit FTP beschäftigt, aber ich versuchs mal:
    Kommandos und Überishct
    Wikipedia über FTP (etwas kurz)
    Wird nicht deine Lieblings-Lektüre werden 😉
    Auch nützlich, mit Befehlen

    Das wars fürs Erste, viel Spaß 😃



  • Du musst wohl noch nen Zeilenumbruch mitsenden (\012 oder so).

    (und noch nen Link: http://cr.yp.to/ftp.html)



  • Hi, hab jetzt herausgefunden wie ich dem FTP Client etwas senden kann, aber habe keine ahnung wiso dass so ist 😞

    377\366RE\377\374TTR abc\377\377def\015\377\376\012\012
    

    Kann mir jemand den String erklären 👍 😋



  • 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 😉


Anmelden zum Antworten