Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 20.05.2017
Сообщений: 12

Сделать, чтобы программа скачивала все файлы с FTP с заданной папки

20.05.2017, 10:58. Показов 983. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужно сделать, чтобы программа скачивала все файлы с FTP с заданной папки.
Переход в папку после авторизации через CWD я делаю, после этого мне надо считать все файлы в папке (не могу придумать как это сделать) и их скачать, но дело в том, что RETR (на заданный файл) после CWD уже не работает.
Подскажите пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#include "stdafx.h"
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "WS2_32.lib")
 
#define SERVERADDRESS "192.168.0.1"//"192.168.0.1"
#define CLIENTADDRESS "127.0.0.1"
#define SERVICE_PORT 21
 
int port_listen;
#define bufsize 1024
 
char bufrecv[bufsize] = { 0 };
char * address_serv = "192.168.0.1";
 
void BufClean(char *str) {
    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        str[i] = '\0';
    }
}
bool ReadServer(int socket)
{
    char sReceiveBuffer[1024] = "";
    int nReaded = recv(socket, sReceiveBuffer, sizeof(sReceiveBuffer) - 1, 0);
    if (nReaded <= 0) return false;
    sReceiveBuffer[nReaded] = 0;
    printf("\n%s", sReceiveBuffer);
    memset(sReceiveBuffer, 0, sizeof(sReceiveBuffer));
    nReaded = 0;
    return true;
}
 
bool ReadServerVar(int socket)
{
    char sReceiveBuffer[80] = "";
    int nReaded = recv(socket, sReceiveBuffer, sizeof(sReceiveBuffer) - 1, 0);
    if (nReaded <= 0) return false;
    sReceiveBuffer[nReaded] = 0;
    printf("\n%s", sReceiveBuffer);
    memset(sReceiveBuffer, 0, sizeof(sReceiveBuffer));
    nReaded = 0;
    return true;
}
 
void Auth(int S)
{
    char name[] = "USER admin\r\n";
    /*cout << "Введите логин: ";
 
    cin >> name;
    char str[512];*/
    //sprintf(str, "USER \r\n", name);
    send(S, name, strlen(name), 0);
    ReadServer(S);
 
    //cout << "Введите пароль: ";
    char pass[] = "PASS admin\r\n";
    //cin >> pass;
    //sprintf(str, "PASS %s\r\n", pass);
    send(S, pass, strlen(pass), 0);
    ReadServer(S);
}
 
SOCKET RandomSocket()
{
    SOCKET SecondSocket;
    SecondSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (SecondSocket == INVALID_SOCKET)
    {
        fprintf(stderr, "Невозможно создать сокет!\n");
        exit(1);
    }
 
    sockaddr_in client;
    port_listen = rand() % 800 + 1023;
    printf("Прослушивающий порт = %d\n", port_listen);
    memset(&client, 0, sizeof(client));
    client.sin_family = AF_INET;
    client.sin_addr.s_addr = inet_addr(CLIENTADDRESS);
    client.sin_port = htons(port_listen);
 
    if (bind(SecondSocket, (sockaddr*)&client, sizeof(client)) == INVALID_SOCKET)
    {
        fprintf(stderr, "Can't bind\n");
        exit(1);
    }
    if (listen(SecondSocket, 5) == INVALID_SOCKET)
    {
        fprintf(stderr, "Can't listen\n");
        exit(1);
    }
    return SecondSocket;
}
void read(SOCKET S)
{
    recv(S, bufrecv, bufsize, 0);
    cout << bufrecv;
    BufClean(bufrecv);
}
int main(void)
{
    setlocale(LC_ALL, "RUS");
    char buf[50];
 
    SOCKET S;
    SOCKET S_second;
    sockaddr_in dest_addr;
    sockaddr_in client;
    WSADATA wsadata;
    SOCKET  SocketMain = INVALID_SOCKET;
    // Инициализируем библиотеку сокетов
    WSAStartup(MAKEWORD(2, 2), &wsadata);
 
    /*printf("Введите IP: ");
    scanf("%s", buf);
    char* ip = new char[strlen(buf)];
    int i = 0;
    for (i = 0; i < strlen(buf); i++)
    ip[i] = buf[i];
    ip[i] = 0;
    printf("\nIP: %s\n", ip);*/
 
    // Создаем сокет. Для TCP-сокета указываем параметр SOCK_STREAM. Для UDP - SOCK_DGRAM.
    if ((S = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        fprintf(stderr, "Невозможно создать сокет!\n");
        exit(1);
    }
    // Заполняем структуру адресов 
    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;
    // Преобразование IP адреса из символьного в сетевой формат
    //dest_addr.sin_addr.s_addr = inet_addr(SERVERADDRESS);
    dest_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
    // Обратите внимание на преобразование порядка байт
    dest_addr.sin_port = htons((u_short)SERVICE_PORT);
 
    if (connect(S, (sockaddr*)&dest_addr, sizeof(dest_addr)) == INVALID_SOCKET)
    {
        printf_s("Ошибка соединения!\n");
        exit(1);
    }
 
    //printf("Соединение с %s успешно установлено\n", ip);
    ReadServer(S);
    Auth(S);
 
    while (true)
    {
        char str[512];
        int action;
        printf("Введите номер команды: \n 1. Общее задание (Вывод списка файлов и директорий).\n 2. Задание 9 (Получение информации о текущей FTP-сессии и типе системы сервера). \n 3. Выход\n");
        scanf("%d", &action);
        switch (action)
        {
        case 1:
        {
            SOCKET      SocketListen = INVALID_SOCKET;
 
            send(S, "PASV\r\n", strlen("PASV\r\n"), 0);
            recv(S, bufrecv, bufsize, 0);
            printf("%s", bufrecv);
            int a1 = 0, a2, a3, a4, p1, p2;
            sscanf(bufrecv, "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)", &a1, &a2, &a3, &a4, &p1, &p2);
            BufClean(bufrecv);
 
            sockaddr_in address;
            int port = p1 * 256 + p2;
 
            if ((SocketListen = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
                fprintf(stderr, "Не удалось создать сокет\n");
                exit(1);
            }
            // Заполняем структуру адресов 
            address.sin_family = AF_INET;
            address.sin_addr.s_addr = inet_addr("192.168.0.1");
            address.sin_port = htons(port); // порт FTP
 
                                            // Связываем сокет с заданным сетевым интерфесом и портом
            if (connect(SocketListen, (sockaddr*)&address, sizeof(address))) {
                fprintf(stderr, "Не удалось создать соединение\n");
                system("PAUSE");
                exit(1);
            }
 
            char s[] = "LIST\r\n";
            send(S, s, strlen(s), 0);
 
            read(S);
            read(SocketListen);
            read(S);
 
            closesocket(SocketListen);
 
        }
        case 2:
        {
 
            sockaddr_in address;
 
            int i = 0;
            char str[512];
            char client_ip[50];
            for (i = 0; i < strlen(CLIENTADDRESS); i++)
                client_ip[i] = CLIENTADDRESS[i];
            client_ip[i] = 0;
            SOCKET S_second = RandomSocket();
            char port[64] = "PORT ";
            int port1 = port_listen / 256;
            int port2 = port_listen % 256;
            char portstr1[5] = "";
            char portstr2[5] = "";
            int j = 5;
            for (i = 0, j = 5; i < strlen(client_ip); i++, j++)
            {
                if (client_ip[i] == '.') port[j] = ',';
                else port[j] = client_ip[i];
            }
            port[j] = ',';
            j++;
            _itoa(port1, portstr1, 10);
            _itoa(port2, portstr2, 10);
            for (i = 0, j; i < strlen(portstr1); i++, j++)
                port[j] = portstr1[i];
            port[j] = ',';
            j++;
            for (i = 0, j; i < strlen(portstr2); i++, j++)
                port[j] = portstr2[i];
            port[j] = 0;
            sprintf(str, "%s\r\n", port);
            send(S, str, strlen(str), 0);
            ReadServer(S);
 
            send(S, "CWD pub/\n", strlen("CWD pub/\n"), 0);
            send(S, "RETR test.exe", strlen("test.exe"), 0);
 
    /*      char nameFile[265];
            printf("Ведите имя файла: ");
            scanf("%s", nameFile);*/
 
        //  char list[300] = "RETR test.exe";
 
        ///*    int n = 4;
        //  for (int i = 0; i < strlen(nameFile); i++, n++) {
        //      list[n] = nameFile[i];
        //  }*/
        //  sprintf(list, "%s\r\n", list);
 
        //  
        //  send(S, list, strlen(list), 0);
 
            SOCKET NS;
            sockaddr_in clnt_addr;
            int addrlen = sizeof(clnt_addr);
            memset(&clnt_addr, 0, sizeof(clnt_addr));
            // Заполняем структуру адресов 
            address.sin_family = AF_INET;
 
            //char s[] = "NLST\r\n";
            //send(S, s, strlen(s), 0);
 
            ////char list[300] = "NLST ";
            ////char list1[300] = "SYST ";
 
            ////sprintf(list, "%s\n", list);
            ////sprintf(list1, "%s\r\n", list1);
 
            ////send(S, list, strlen(list), 0);
            ////send(S, list1, strlen(list1), 0);
 
            address.sin_addr.s_addr = inet_addr("192.168.0.1");
            address.sin_port = htons(21); // порт FTP
                                          ///*  if (NS == INVALID_SOCKET)
                                          //  {
                                          //      fprintf(stderr, "Can't accept connection\n");
                                          //      break;
                                          //  }*/
            read(S);
            read(S);
            ReadServerVar(S);
            closesocket(S_second);
            system("PAUSE");
        }
        case 3:
        {
            closesocket(S);
            WSACleanup();
            exit(1);
        }
        system("PAUSE");
        }
    }
    system("PAUSE");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2017, 10:58
Ответы с готовыми решениями:

Функцией FTP закачать все файлы из папки
Задача стоит следующая, залить на сервер FTP все файлы находящиеся в папке temp_files_X (x - id операцииции) в корне сайта. Имена файлов...

Загрузить все файлы из папки по ftp(ftplib)
В общем есть сервер FTP ,из него надо скачивать ВСЕ файлы каждые 60 сек ,а не один как указанно в моем коде ,причем точное название всех...

Как передать все файлы из папки на FTP?
помогите написать bat файл чтобы с помощью него на ftp копировались все файлы из папки с локального компа set addr=script echo.open...

2
Заблокирован
21.05.2017, 16:40
Здравствуйте, checkdimon, можно посмотреть, только вот не ясно, что в вашем примере.
Сначала определитесь, выступаете в роли сервера или клиента. Ведь никто не будет за вас разбирать.
0
0 / 0 / 0
Регистрация: 20.05.2017
Сообщений: 12
21.05.2017, 17:48  [ТС]
Цитата Сообщение от stamp Посмотреть сообщение
Здравствуйте, checkdimon, можно посмотреть, только вот не ясно, что в вашем примере.
Сначала определитесь, выступаете в роли сервера или клиента. Ведь никто не будет за вас разбирать.
Программа - клиент
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2017, 17:48
Помогаю со студенческими работами здесь

Скопировать все файлы из папки на ftp сервер
Как батником скопировать все файлы (*.*) из папки D:\001\send в папку на ftp сервере?

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

Написать скрипт, который читает все файлы из заданной папки
Помогите кто-нибудь с заданием по практике. Нужно написать скрипты на VBScript 1. Написать скрипт, который читает все файлы из заданной...

Как сделать, чтобы web-сервер видел файлы, загруженные пользователем по ftp?
Всем привет, подскажите плз как сделать так, чтобы при загрузке FTP пользователем в /data/ftp/ права для www-data или group/other...

Как сделать, чтобы файлы из одной папки отображались в другой?
Здравствуйте! Никак не соображу как сделать так, чтобы в домашней папке /home/pavel/Документы отображались файлы из папки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru