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

Получить список всех файлов (winsock, ftp, LIST)

06.08.2011, 16:54. Показов 4738. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Встала передо мной следующая задача.
Мне нужно скачать все файлы с ftp.
С ftp удалось соединиться, залогиниться, установить пассивный режим.
Но вот получить список всех файлов я не смог.

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
int FtpConnect::init()
{
    WSADATA WSAData;
    if(WSAStartup(MAKEWORD(2,0),&WSAData) != 0)
     {
          cout << "786";
     }
    else
    {
          cout << WSAData.wVersion << endl;
    }
    sockaddr_in address;
    SOCKET S = socket(AF_INET,SOCK_STREAM,0);
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("77.246.101.195");
    address.sin_port = htons(21);
 
    int len;
    int result;
    len = sizeof(address);
    result = connect(S, (sockaddr *)&address, len);
    if (result == -1) 
    {
        cout << "87698";
        return -1;
    }
 
    FtpConnect::readServ(S);
 
    char name[64] = "free";
    char str[512];
    sprintf(str,"USER %s\r\n",name);
    send(S,str,strlen(str),0);
    FtpConnect::readServ(S);
    char pass[64] = "free";
    sprintf(str,"PASS %s\r\n",pass);
    send(S,str,strlen(str),0);
    FtpConnect::readServ(S);
    send(S,"PASV\r\n",strlen("PASV\r\n"),0);
    FtpConnect::readServ(S);
    send(S,"LIST\r\n",strlen("LIST\r\n"),0);
    FtpConnect::readServ(S);
 
    closesocket(S);
    WSACleanup();
}
 
int FtpConnect::readServ(int S)
{
    int rc;
    int trtr;
    fd_set fdr;
    FD_ZERO(&fdr);
    FD_SET(S,&fdr);
    timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;  
    do {
        char buff[512];
       trtr = recv(S,buff,512,0);
        cout << buff;
        rc = select(S,&fdr,NULL,NULL,&timeout);
    } while(rc);
    cout << trtr;
    return 2;
}
Код по сути сдернут отсюда.
При запуске приложения сразу стартует метод FtpConnect::init.

В ответ на комманду LIST от ftp сервера не приходит ни чего.
Помогите, пожалуйста, определить в чем проблема с LIST.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2011, 16:54
Ответы с готовыми решениями:

Получить список всех файлов с FTP
Как получить список всех файлов с FTP? Использую код: idFTP1.List; for I := 2 to idFTP1.DirectoryListing.Count-1 do...

Ftp LIST не выдаёт список файлов в директории
доброго времени суток. пытаюсь создать свой фтп-клиент отправляю серверу команду ClientSocket1.Socket.SendText('LIST ' + edit3.text...

QT 5.7 + FTP - получить список файлов на сервере
Подскажите как получить список файлов на сервере ? Использую QNetworkAccessManager скачать и отправить файл могу, а прочитать список не...

10
 Аватар для igorrr37
2869 / 2016 / 991
Регистрация: 21.12.2010
Сообщений: 3,722
Записей в блоге: 15
06.08.2011, 18:10
в ответ на PASV приходит айпи и порт на который надо коннектиться и тянуть оттуда лист, с файлами также, почитай про ftp.
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
#include <iostream>
#include <windows.h>
#include <algorithm>
#include <string>
#include <fstream>
#include <boost/asio.hpp>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/scoped_ptr.hpp>
typedef boost::asio::ip::tcp tcp;
 
boost::asio::streambuf reqBuf;
std::ostream reqStream(&reqBuf);
boost::scoped_ptr<boost::asio::streambuf> pRespBuf(new boost::asio::streambuf());
std::istream respStream(pRespBuf.get());
boost::asio::io_service io;
boost::system::error_code err;
tcp::socket sock(io), tmpSock(io);
boost::cmatch regRes;
boost::regex reg("\\((\\d+,\\d+,\\d+,\\d+),(\\d+),(\\d+)\\)");
 
void SendRequest(std::string s){
    reqStream<<s<<"\r\n";
    boost::asio::write(sock, reqBuf);
}
 
void PrintResponse(){
    boost::asio::read_until(sock, *pRespBuf, "\r\n");
    (std::cout<<pRespBuf.get()).clear();
}
 
void ConnectTmp(){
    char buf[512]={'\0'};
    boost::asio::read(sock, boost::asio::buffer(buf, sizeof(buf)), boost::asio::transfer_at_least(1));
    std::cout<<"buf= "<<buf<<"\n";
    unsigned short port;
    if(!boost::regex_search(buf, regRes, reg)){
        std::cerr<<"regex_search() failed\n";
        return;
    }
    std::string ip(regRes[1]);
    std::replace(ip.begin(), ip.end(), ',', '.');
    port=boost::lexical_cast<unsigned short>(regRes[2])*256+boost::lexical_cast<unsigned short>(regRes[3]);
    std::cout<<"parsed address: "<<ip<<" : "<<port<<"\n";
    tmpSock.connect(tcp::endpoint(boost::asio::ip::address::from_string(ip), port), err);
    if (err){
        std::cerr<<"tmpSock.connect() failed:\n"<<err.message()<<"\n";
        return;
    }
    else std::cout<<"tmpSock.connect() OK: "<<tmpSock.remote_endpoint().address().to_string()<<"\n";
}
 
void DataToStream(const std::string& fileName=""){
    std::cout<<"DataToStream called\n";
    std::ofstream ofs(fileName.c_str(), std::ios::binary);
    char buf[4096];
    std::size_t len, sum=0;
    do{
        len=boost::asio::read(tmpSock, boost::asio::buffer(buf, sizeof(buf)), boost::asio::transfer_all(), err);
        sum+=len;
        fileName==""?std::cout.write(buf, len):ofs.write(buf, len);
    }while(!err);
    std::cout<<"sum= "<<sum<<"\n";
    if(err!=boost::asio::error::eof){
        std::cerr<<"read() failed\n";
    }
    ofs.close();
    tmpSock.shutdown(tcp::socket::shutdown_both);
    tmpSock.close();
}
 
int main(){
    SetConsoleOutputCP(1251);
    try{
        tcp::resolver resolver(io);
        tcp::resolver::query q("77.246.101.195", "ftp");
        tcp::resolver::iterator it = resolver.resolve(q, err), itEnd;
        if (err){
            std::cerr<<"resolve() failed:\n"<<err.message()<<"\n";
            return __LINE__;
        }
        else std::cout<<"resolve() OK\n";
        err = boost::asio::error::host_not_found;
        while (err && it != itEnd){
            sock.close();
            sock.connect(*it++, err);
        }
        if (err){
            std::cerr<<"connect() failed:\n"<<err.message()<<"\n";
            return __LINE__;
        }
        else std::cout<<"connect() OK: "<<sock.remote_endpoint().address().to_string()<<"\n";
        PrintResponse();
        SendRequest("user anonymous");
        PrintResponse();
        SendRequest("pass [email]password@spam.la[/email]");
        PrintResponse();
        SendRequest("pasv");
        ConnectTmp(); // коннектимся на предложенный адрес
        SendRequest("list");
        PrintResponse();
        DataToStream(); // качаем лист
        PrintResponse();
        SendRequest("quit");
        PrintResponse();
        sock.shutdown(tcp::socket::shutdown_both);
        sock.close();
    }
    catch(std::exception& e){
        std::cerr<<"Thrown exception:\n"<<e.what()<<"\n";
    }
    return 0;
}
Миниатюры
Получить список всех файлов (winsock, ftp, LIST)  
1
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
07.02.2016, 17:41
Цитата Сообщение от igorrr37 Посмотреть сообщение
#include <boost/asio.hpp>
#include <boost/regex.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/scoped_ptr.hpp>
А что это за подключаемые файлы?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.02.2016, 17:19
oleg rus, ознакомьтесь с библиотекой Boost
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
08.02.2016, 22:41
Там по английски всё написано,я не понимаю. Если я правильно понял её надо скачать.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.02.2016, 23:01
Цитата Сообщение от alex_2017 Посмотреть сообщение
Мне нужно скачать все файлы с ftp.
Нескромный вопрос: Может проще будет использовать WinINET?
Например вот эту функцию: https://msdn.microsoft.com/en-... 85%29.aspx
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
08.02.2016, 23:36
Цитата Сообщение от Hikari Посмотреть сообщение
Нескромный вопрос: Может проще будет использовать WinINET?
Например вот эту функцию: https://msdn.microsoft.com/en-... 85%29.aspx
А с помощью WinInet можно написать FTP-client?
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
09.02.2016, 07:17
oleg rus, перейдя по ссылке ты увидишь слово "FtpGetFile". Как сам думаешь, что это может значить?

А вообще, без минимального английского ты далеко не уйдёшь...
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.02.2016, 07:44
Цитата Сообщение от oleg rus Посмотреть сообщение
А с помощью WinInet можно написать FTP-client?
Да, вполне. Набери в гугле пример с FtpGetFile и увидишь как считывать файлы.
0
6 / 6 / 0
Регистрация: 13.05.2012
Сообщений: 593
10.02.2016, 22:27
Цитата Сообщение от Usaga Посмотреть сообщение
слово "FtpGetFile". Как сам думаешь, что это может значить?
Получить файл с FTP вот что это значит, но прежде чем получить файл с сервера к нему надо как-то подключится,используя пароль,хост,имя.
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
11.02.2016, 05:07
Цитата Сообщение от oleg rus Посмотреть сообщение
к нему надо как-то подключится
Там же, где есть информация по данной функции, есть и информация и о других. И ещё примеры. Неужели так сложно попробовать поискать?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2016, 05:07
Помогаю со студенческими работами здесь

Не удается получить список файлов на хостинге ftp
Взгляните на код, пожалуйста: FTPClient ftc = new FTPClient(); try { ...

Получить размер всех файлов на FTP-сервере
Приветствую! Для решения задачи использую метод public long GetFolders(string ftp) { List&lt;string&gt;...

Получить список файлов в List асинхронно
Всем доброго времени суток! Столкнулся с проблемой при асинхронном получении списка файлов: List&lt;string&gt;...

Как получить список файлов ftp, используя фильтр?
доброго времени суток подскажите как получить список файлов ftp используя фильтр мне нужно отредактировать файлы содержащие в имени...

Получить список файлов из заданной папки на FTP-сервере
Программа должна: 1)Подключаться к заданному FTP-серверу с указанным логином и паролем (сделано) 2)Получать список файлов из...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru