120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236

Ftp клиент

16.08.2017, 17:55. Показов 7591. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу ftp клиент который соединяется с сервером в пассивном режиме,для этого нужно создать два сокета,что собственно и сделал.Первый сокет соединяется с 21 портом,все проходит успешно,читает и записывает отлично.Но второй сокет вроде как соединился,но не читает данныес него.В моем случае команда LIST отправляется по первому сокету,а ее результат читается вторым,но этого не происходит.Вот код:
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
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>
 
using boost::asio::ip::tcp;
 
struct endPoint{
    std::string addr;
    int port;
};
 
std::string insertFrom(std::string input_str,int index,int count);
 
endPoint resultToendPoint(std::string result);
 
tcp::socket *socketPtr;
tcp::socket *socket_dataPtr;
 
void closeSocket();
 
int main(int argc, char* argv[]){
 
    endPoint endpoint;
    boost::asio::streambuf result;
    std::istream result_stream(&result);
    std::string resultstr;
    boost::asio::streambuf request;
    std::ostream request_stream(&request);
 
  try{
 
//connecting to command socket
    boost::asio::io_service io_service;
    tcp::resolver resolver(io_service);
    tcp::resolver::query query(argv[1], "ftp");
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    tcp::socket socket(io_service);
    boost::asio::connect(socket, endpoint_iterator);
 
//check
    if(socket.is_open()){
 
//send request
    request_stream << "USER "login""<<"\r\n";
    request_stream << "PASS "pass"\r\n"<<"\r\n";
    request_stream << "PASV"<<"\r\n";
    boost::asio::write(socket, request);
 
//wait one second
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
 
//get result and extract address and port for connecting to data socket
    boost::asio::read_until(socket, result, "\r\n");
    while(std::getline(result_stream,resultstr))
      if(insertFrom(resultstr,0,3)=="227")
            endpoint=resultToendPoint(resultstr);
    std::cout<<endpoint.addr<<std::endl;
    std::cout<<endpoint.port<<std::endl;
 
}else std::cout<<"connection to command socket is fail"<<std::endl;
 
//connecting to data socket
    tcp::endpoint ep(boost::asio::ip::address::from_string(endpoint.addr),endpoint.port);
    tcp::socket socket_data(io_service);
    socket_data.connect(ep);
 
//check
if(socket_data.is_open()){
 
//send request
    request_stream.flush();
    request_stream<<"LIST"<<"r\n";
    boost::asio::write(socket, request);
 
//wait one second
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
 
//get result
     boost::asio::read(socket_data, result);
    while(std::getline(result_stream,resultstr))
    std::cout<<resultstr<<std::endl;
 
}else std::cout<<"connection to data socket is fail"<<std::endl;
 
    socketPtr=&socket;
    socket_dataPtr=&socket_data;
 
  }catch (std::exception& e){
        std::cout << "Exception: " << e.what() << "\n";
        closeSocket();
  }
 
//close sockets
    closeSocket();
 
    return 0;
}
 
 
// function extracting part of string from other string
std::string insertFrom(std::string input_str,int index,int count){
    std::string result;
    for(int i=index;i<index+count;i++)
        result.push_back(input_str[i]);
    return result;
}
 
 
// function geting endpoint from result string
endPoint resultToendPoint(std::string result){
 
    endPoint endpoint;
 
//geting base part as (xxx,xxx,xxx,xxx,xxx,xxx)
    for(int i=0;i<=result.size();i++)
        if(result[i]=="("[0])
            for(int u=i;u<result.size();u++)
                if(result[u]==")"[0])
                    for(int o=i+1;o<u;o++)
                        endpoint.addr.push_back(result[o]);
 
 
int s=0;
int p=0;
std::string port;
std::string addr=endpoint.addr;
 
 
//geting address from base string , replace ',' with '.' and geting base port as (xxx,xxx)
    for(int i=0;i<=endpoint.addr.size();i++)
        if(s<4){
if(addr[i]==","[0]){
    addr[i]="."[0];
    s++;
}
}else{
port.push_back(endpoint.addr[i]);
addr.erase(i-p,1);
p++;
    }
    addr.pop_back();
 
 
//spliting the port on two parts;
    bool flag=false;
    std::string a;
    std::string b;
    for(int i=0;i<=port.size()-1;i++){
        if(port[i]==","[0])
            flag=true;
        if(flag==false)
            a.push_back(port[i]);
        else
            b.push_back(port[i+1]);
    }
 
 
//calculating the port and writing the port and the address in the endpoint
    endpoint.port=atoi(a.c_str())*256+atoi(b.c_str());
    endpoint.addr=addr;
 
    return endpoint;
}
 
 
//function closing sockets
void closeSocket(){
    socketPtr->close();
    socket_dataPtr->close();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2017, 17:55
Ответы с готовыми решениями:

FTP клиент wininet
Чуваки, такая проблема. Написал простенький FTP клиент с использованием wininet.h (код на плюсах, интерфейс - qml). Установил сервер...

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

Используя системный FTP клиент командной строки загрузите файл на FTP-сервер
Задание: Используя системный FTP клиент командной строки загрузите файл на FTP-сервер. Как это сделать?

1
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
17.08.2017, 22:51  [ТС]
все,с запросом LIST разобрался-надо было просто создать отдельный istream для второго потока.
НО запрос STOR создает на сервере указанный файл но ничего в него не записывает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.08.2017, 22:51
Помогаю со студенческими работами здесь

Ftp-клиент
Всем доброго времени суток! может кто подскажет (или уже делал), как реализовать приложение ftp-клиент? Суть такова: программа должна...

FTP клиент
Ребят нужна помощь кто может ответьте, делаю FTP клиент, подключается все нормально, добавил функцию удаления директории Но при удалении...

FTP клиент
Добрый день! Необходимо загрузить файл на FTP сервер. Не получается соединиться с FTP сервером, прошу Вашей помощи. Второй день...

ftp-клиент
Доброго времени суток. C# изучал давно (год назад) да и то поверхностно... А сеть не трогал при изучении вообще, даже классы как то не...

Ftp клиент
Подскажите, пожалуйста, хороший FTP-клиент...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
Трассировка корутин Kotlin с OpenTelemetry
mobDevWorks 14.07.2025
Асинхронное программирование меняет правила игры, особенно когда речь заходит о трассировке операций. В Kotlin с его корутинами эта проблема приобретает особый оттенок, который я хотел бы детально. . .
Облачные приложения на Rust: руководство по архитектуре микросервисов
golander 13.07.2025
Когда я впервые взялся за проектирование облачной платформы для одного из наших клиентов, выбор стоял между привычными Go и Java. Но после нескольких месяцев разработки микросервисной системы,. . .
Как Node.js выполняет асинхронные операции
Reangularity 13.07.2025
Каждый раз, когда я рассказываю про Node. js, возникает один и тот же вопрос: "Как эта штука может быть быстрой, если JavaScript — однопоточный язык?" И это действительно кажется парадоксом. Ведь в. . .
Как писать чистый, тестируемый и качественный код на Python
py-thonny 12.07.2025
Помню свой первый проект на Python. Работал тогда быстро, грязно, лишь бы работало. Код был похож на запутанный клубок - переменные по одной букве, функции на 200 строк, комментарии отсутствовали как. . .
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru