#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)
, чтобы отключить командное соединение клиента после отправки начального ответа, перед отправкой файла по соединению для передачи данных.