Команда RETR в FTP, как сервер отправляет файл клиенту?

#sockets #ftp #client-server #protocols

#сокеты #ftp #клиент-сервер #протоколы

Вопрос:

Я внедряю очень простую программу FTP-сервера, которая способна извлекать и сохранять текстовые файлы. мой вопрос в том, когда в запросе ftp-клиента указывается файл со следующим «RETR test.txt «как сервер отправляет этот файл?. Он открывает этот текстовый файл, копирует содержимое в буфер и просто отправляет его или есть что-то еще?. Я не уверен, как это реализовать, может кто-нибудь прояснить основную идею?.

Редактировать::

 if (strncmp(receive_buffer,"RETR",4)==0)  {
                sprintf(send_buffer,"150 Opening ASCII mode data connection... rn");
                printf("<< DEBUG INFO. >>: REPLY sent to CLIENT: %sn", send_buffer);
                bytes = send(ns, send_buffer, strlen(send_buffer), 0);
                if (bytes < 0) break;
                closesocket(ns);

                char temp_buffer2[80];

                FILE *fin=fopen("test.txt","r");//open test.txt
                while (!feof(fin)){
                    fgets(temp_buffer2,78,fin);
                    sprintf(send_buffer,"%s",temp_buffer2);
                    printf("%s",send_buffer);

                    if (active==0) {
                        printf("***active is 0");
                        send(ns_data, send_buffer, strlen(send_buffer), 0);
                    }
                    else {
                        printf("***active is 1 ");
                        send(s_data_act, send_buffer, strlen(send_buffer), 0);
                    }
                }
                fclose(fin);
                sprintf(send_buffer,"226 File transfer complete. rn");
                printf("<< DEBUG INFO. >>: REPLY sent to CLIENT: %sn", send_buffer);
                bytes = send(ns, send_buffer, strlen(send_buffer), 0);
                if (active==0 )closesocket(ns_data);
                else closesocket(s_data_act);
            }
  

это то, что я сделал, и для команды RETR он открывается test.txt чтобы попытаться отправить его. Но это приводит к отключению сервера..

Ответ №1:

Не имеет значения, как вы его отправляете. Вы можете считывать по одному байту за раз и вызывать Send для каждого байта. Или вы могли бы создать буфер из 8192 байт и отправлять столько за раз. Или любое другое количество байт.

Какое значение имеет, находится ли FTP-сервер в активном или пассивном режиме: http://slacksite.com/other/ftp.html

Комментарии:

1. здравствуйте, сервер находится в активном режиме, но как мне отправить подобный файл?

2. тогда купите или используйте вместо этого компонент с открытым исходным кодом. Это звучит дешевле.

3. что ж. Вы используете пассивный режим в своем коде.. Активный режим означает, что передачи выполняются в отдельных соединениях.

4. но клиент выдает команду PORT, и сервер помечает это с помощью переменной «active»

5. ДА s_data_act . И я получаю положительный ответ от сервера при прослушивании в активном режиме. но ftp-клиент никогда не получает файл, и сервер просто отключается?. правильный ли способ отправки файла?. Я просто считываю текст внутри файла в буфер и отправляю его ??.

Ответ №2:

Одна ошибка в вашем коде заключается в том, что вы вызываете closesocket(ns) , чтобы отключить командное соединение клиента после отправки начального ответа, перед отправкой файла по соединению для передачи данных.