Frage

Ich erstelle einen FTP-Server in C.Auf der Clientseite verwende ich FileZilla.Mein Code enthält bisher nur den Handshaking-Teil.

Das Problem, das ich habe, ist, dass die Zeichenfolgen, die ich für das Terminal ausdrucke, an FileZilla gesendet werden.Meine Frage ist, wie ich diese beiden voneinander trennen kann. Ich habe ein paar Dinge ausprobiert, aber keines davon liefert das richtige Ergebnis.

Dies ist nur ein Teil meines Codes, aber für meine Frage ist dies der nützliche Teil:

while (FOREVER){
    addr_size = sizeof their_addr;

    newfd = accept(listener, (struct sockaddr*) &their_addr, &addr_size);
    if (newfd == -1){
        perror("accept");
        continue;
    }
    if ((send(newfd, "220 JEDI FTP is ready", 50, 0)) <= 0)
        perror("error sending");

    puts("connection established");
    puts("waiting for user & connection");
  while (!login){
        // username
        if (!user){
            if ((recv(newfd, buffer, BUFFCON, 0)) <= 0){
                puts("error receiving username");

            }
            else{

                if (strstr(buffer, "USER") != NULL){

                    if (strstr(buffer, name) != NULL){

                        send(newfd, "331 password required", 50, 0);
                        puts("username correct");

                        user = 1;
                    }
                    else{
                        puts("username incorrect");
                        send(newfd, "430 username incorrect", 50, 0);
                    }//else
                }//if
            }//else
        }//if user

Und das ist die Ausgabe in FileZilla:

  • Status:Die Adresse wird von localhost angegeben
  • Status:Verbinden mit [::1]:21...
  • Status:Verbinding aangemaakt, welkomstbericht afwachten...
  • Antwort:220 JEDI FTP ist fertig
  • Kommando:BENUTZER yoda
  • Antwort:Verbindung hergestellt
  • Hinweis:Kann nicht mit Server verbunden werden

Anstatt also „331-Passwort erforderlich“ zu senden, wird „Verbindung hergestellt“ gesendet.

Ich hoffe, Sie können mir dabei helfen. Vielen Dank.

War es hilfreich?

Lösung

Das Problem ist, dass Ihr len Parameter für send es ist zu groß. send hat kein Konzept für nullterminierte Zeichenfolgen;es funktioniert nur mit rohen Bytesequenzen.Also der Anruf send(newfd, "220 JEDI FTP is ready", 50, 0) sendet den String "220 JEDI FTP is ready", und dann, was auch immer danach in die Erinnerung kommt.Technisch gesehen ist das so undefiniertes Verhalten, also im wahrsten Sinne des Wortes irgendetwas könnte passieren (normalerweise ein Segfault).Da in Ihrem Fall konstante Literalzeichenfolgen normalerweise nacheinander im Speicher gespeichert werden, send liest die angegebene Zeichenfolge und anschließend eine andere Zeichenfolge.

Was Sie tun möchten, ist nur Senden Sie die genaue Zeichenfolge (die übrigens die CR-LF-Sequenz benötigt). \r\n nach jedem Befehl).Nicht mehr und nicht weniger.Sie können a implementieren sends Funktion zum Senden einer Zeichenfolge wie folgt:

ssize_t sends(int fd, const char *str)
{
    size_t len = strlen(str);
    return send(fd, str, len, 0);
}

Beachten Sie auch, dass die gesendeten Daten dies tun nicht Schließen Sie den Nullterminator ein, da das TCP-Paket die Größe der Zeichenfolge angibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top