Команда RETR в FTP, как сервер отправляет файл клиенту? - PullRequest
0 голосов
/ 21 апреля 2011

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

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

if (strncmp(receive_buffer,"RETR",4)==0)  {
                sprintf(send_buffer,"150 Opening ASCII mode data connection... \r\n");
                printf("<< DEBUG INFO. >>: REPLY sent to CLIENT: %s\n", 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. \r\n");
                printf("<< DEBUG INFO. >>: REPLY sent to CLIENT: %s\n", 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, чтобы попытаться отправить его. Но это приводит к отключению сервера ..

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

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

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

1 голос
/ 22 апреля 2011

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

...