Domanda

Sto facendo un server FTP in C. Al lato client sto usando FileZilla.Il mio codice finora contiene solo la parte della handshaking.

Il problema che ho è che le corde che stampato per il terminale vengano inviate a filezilla. La mia domanda è come posso tenere questi due separati, ho provato un paio di cose, ma nessuno di loro dà il risultato corretto.

Questa è solo una parte del mio codice, ma per la mia domanda è questa parte utile:

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
.

E questa è l'output in FileZilla:

    .
  • Stato: ADRES BEPALEN VAN LOCALHOST
  • Stato: Verbinden Met [:: 1]: 21 ...
  • Stato: Verbinding Aangemaakt, Welkomstbericht Afwachten ...
  • antwoord: 220 jedi ftp è pronto
  • commando: utente yoda
  • Antwoord: connessione stabilita
  • Fout: Kan Niet Verbinden Met Server

Quindi invece di inviare "331 password richiesta" Invia "Connessione stabilita"

Spero di potermi aiutare con questo, grazie mille.

È stato utile?

Soluzione

Il problema è che il parametro len per send è troppo grande. send non ha alcun concetto di stringhe a null-terminato; Funziona solo con sequenze grezze di byte. Quindi la chiamata send(newfd, "220 JEDI FTP is ready", 50, 0) invia la stringa "220 JEDI FTP is ready", e quindi ciò che accade a venire in memoria dopo di esso. Tecnicamente, questo è comportamento indefinito , così letteralmente qualsiasi cosa potrebbe accadere (di solito un Segfault). Nel tuo caso, poiché le stringhe letterali costanti vengono solitamente memorizzate in sequenza in memoria, send sta leggendo la stringa data, quindi leggendo una stringa diversa dopo di essa.

Cosa vuoi fare è solo Invia la stringa esatta (che, a proposito, ha bisogno della sequenza CR-LF \r\n dopo ogni comando). Ne più ne meno. È possibile implementare una funzione sends per inviare una stringa come:

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

Si noti inoltre che i dati inviati non includono il terminatore NULL, poiché il pacchetto TCP specifica la dimensione della stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top