Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
20 / 16 / 5
Регистрация: 07.01.2019
Сообщений: 90
1

Boost Asio Передача файла от клиента к клиенту

21.01.2019, 13:19. Показов 5822. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть у кого нибудь реализация сервера-передатчика для передачи файлов от клиента к клиенту?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2019, 13:19
Ответы с готовыми решениями:

Как корректно считать вектор boost::asio::streambuf на стороне клиента
Доброго времени суток! Назрел вопрос: Пишу в сокет с помощью boost::asio::buffer...

Boost Asio передача сообщения
Почему выводится только первая буковка? while(1) { char text; ...

Передача большого массива используя boost::asio
Ребят, подскажите пожалуйста! Нужно передать большой массив unsigned char по сети. можно его...

Передача от клиента к серверу и от сервера к клиенту через канал fifo()
Всем привет. Мне нужно через канал fifo отправить от клиента к серверу строку, сервер должен...

3
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
22.01.2019, 13:10 2
Лучший ответ Сообщение было отмечено Peoples как решение

Решение

В самом простом случае будет два этапа:
1. Клиент-сендер подключается к серверу и присылает свой файл на сервер
2. Клиент-ресивер подключается к серверу и присылает ему название желаемого файла. Так как файл уже есть на сервере, то сервер просто присылает этот файл ресиверу
Вот реализация второго этапа
сервер
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <fstream>
#include <boost/asio.hpp>
#include <boost/regex.hpp>
#include <cstdlib>
#include <filesystem>
#include <limits>
 
using namespace std::placeholders;
using tcp = boost::asio::ip::tcp;
namespace fs = std::experimental::filesystem;
 
 
boost::asio::io_service io;
tcp::socket sock{ io };
std::ifstream ifs;
unsigned long long fileSize;
unsigned long long sentFileBody = 0;
char buf[4096];
boost::asio::streambuf sBuf;
std::istream istr{ &sBuf };
 
 
void handleWriteBody(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleWriteBody() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    sentFileBody += bytesTransferred;
    if (ifs)
    {
        ifs.read(buf, std::size(buf));
        boost::asio::async_write(sock, boost::asio::buffer(buf, ifs.gcount()), handleWriteBody);
    }
    else
    {
        if (sentFileBody != fileSize)
        {
            throw std::runtime_error{ "handleWriteBody(): sentFileBody != fileSize\n" };
        }
        std::cout << "sentFileBody: " << sentFileBody << std::endl;
        std::cout << "OK" << std::endl;
    }
 
}
 
void handleWriteHeader(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleWriteHeader() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    ifs.read(buf, std::size(buf));
    boost::asio::async_write(sock, boost::asio::buffer(buf, ifs.gcount()), handleWriteBody);
}
 
void handleReadUntil(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec && ec != boost::asio::error::eof)
    {
        throw std::runtime_error{ "handleReadUntil() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    std::string filePath;
    std::getline(istr, filePath, '\r');
    istr.ignore(std::numeric_limits<std::streamsize>::max());
 
    ifs.open(filePath.c_str(), std::ios::binary);
    if (!ifs.is_open())
    {
        throw std::runtime_error{ "handleReadUntil() : Unable to open input file: " + filePath };
    }
    fileSize = fs::file_size(filePath);
    std::cout << "fileSize: " << fileSize << std::endl;
    std::stringstream ss{ "FileName: " + fs::path{ filePath }.filename().string() + "\r\n" + "FileSize: " + std::to_string(fileSize) + "\r\n\r\n" };
    ss.getline(buf, std::size(buf), '*');
    boost::asio::async_write(sock, boost::asio::buffer(buf, ss.str().size()), handleWriteHeader);
}
 
void handleAccept(boost::system::error_code const& ec)
{
    if (ec)
    {
        throw std::runtime_error{ "handleAccept() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    std::cout << "Client accepted\n";
    boost::asio::async_read_until(sock, sBuf, "\r\n\r\n", handleReadUntil);
}
 
int main()
{
    system("chcp 1251");
    std::cout << "Server\n";
    try
    {
        tcp::acceptor acc{ io, tcp::endpoint{ tcp::v4(), 9090 } };
        acc.async_accept(sock, handleAccept);
        io.run();
 
        sock.shutdown(tcp::socket::shutdown_both);
        sock.close();
        acc.close();
        ifs.close();
    }
    catch (std::exception const& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
    system("pause");
}

клиент
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
#include <boost/asio.hpp>
#include <boost/filesystem.hpp>
#include <boost/regex.hpp>
#include <cstdlib>
 
typedef boost::asio::ip::tcp tcp;
namespace fs = boost::filesystem;
 
boost::asio::io_service io;
tcp::socket sock{ io };
boost::asio::streambuf sBuf;
std::istream istr{ &sBuf };
std::size_t fileSize;
std::size_t sizBody{ 0 };
std::ofstream ofs;
int const siz = 1024;
char buf[siz];
std::string filePath{ "D:/downloads/Music/1 2 3.mp4" }; // файл, который клиент хочет получить от сервера
 
void handleRead(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec && ec != boost::asio::error::eof)
    {
        throw std::runtime_error{ "handleRead() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    sizBody += bytesTransferred;
    ofs << &sBuf;
    std::cout << "sizBody = " << sizBody << std::endl;
 
    if (sizBody != fileSize)
    {
        boost::asio::async_read(sock, sBuf, boost::asio::transfer_at_least(1), handleRead);
    }
    else
    {
        std::cout << "handleRead() : Transfer complete successfully" << std::endl;
    }
}
 
void handleReadUntil(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec && ec != boost::asio::error::eof)
    {
        throw std::runtime_error{ "handleReadUntil() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    boost::smatch mr;
    boost::regex regFileName("FileName: *(.+?)\r\n");
    boost::regex regFileSize("FileSize: *([0-9]+?)\r\n");
    std::string headers, tmp;
    while (std::getline(istr, tmp) && tmp != "\r")
    {
        headers += (tmp + '\n');
    }
    std::cout << "Headers:\n" << headers << std::endl;
    if (!boost::regex_search(headers, mr, regFileSize))
    {
        throw std::runtime_error{ "handleReadUntil() : regFileSize not found" };
    }
    fileSize = std::stoull(mr[1]);
    std::cout << "fileSize = " << fileSize << std::endl;
    if (!boost::regex_search(headers, mr, regFileName))
    {
        throw std::runtime_error{ "handleReadUntil() : regFileName not found" };
    }
    std::string fileName = mr[1];
    std::cout << "fileName = " << fileName << std::endl;
    ofs.open("c:\\" + fileName, std::ios::binary); // файл будет создан в корне диска С
    if (!ofs.is_open())
    {
        throw std::runtime_error{ "handleReadUntil() : Unable to open output file" };
    }
 
    std::cout << "sBuf.size() = " << sBuf.size() << std::endl;
    if (sBuf.size())
    {
        sizBody += sBuf.size();
        ofs << &sBuf;
    }
    if (sizBody != fileSize)
    {
        boost::asio::async_read(sock, sBuf, boost::asio::transfer_at_least(1), handleRead);
    }
    else
    {
        std::cout << "handleReadUntil() : Transfer complete successfully" << std::endl;
    }
}
 
void handleWrite(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleWrite() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    boost::asio::async_read_until(sock, sBuf, "\r\n\r\n", handleReadUntil); // читаем заголовок - ответ сервера
}
 
void handleConnect(boost::system::error_code const& ec)
{
    if (ec)
    {
        throw std::runtime_error{ "handleConnect() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    std::cout << "Connection established\n";
 
    filePath += "\r\n\r\n";
    boost::asio::async_write(sock, boost::asio::buffer(filePath, filePath.size()), handleWrite); // отправляем серверу путь к нужному файлу
}
 
int main()
{
    system("chcp 1251");
    std::cout << "Client\n";
    try
    {
        sock.async_connect(tcp::endpoint{ boost::asio::ip::address::from_string("127.0.0.1"), 9090 }, handleConnect);
        io.run();
 
        ofs.close();
        sock.shutdown(tcp::socket::shutdown_both);
        sock.close();
    }
    catch (std::exception& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
    system("pause");
}
2
20 / 16 / 5
Регистрация: 07.01.2019
Сообщений: 90
22.01.2019, 13:12  [ТС] 3
Да, если сделать хранение файла на сервере, то будет все просто, я уже разобрал такой способ, спасибо конечно за ответ. Но мне нужно сделать сервер-передатчик, который принимает файл от одного клиента и передает остальным подключенным клиентам попакетно. Буду очень благодарен если ктото поможет мне с этим, потратил уже сам на это месяц
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
23.01.2019, 21:54 4
Лучший ответ Сообщение было отмечено Astico как решение

Решение

Без сохранения файла на сервере, что читается от сендера - то сразу пишется каждому ресиверу. Клиент может быть как сендером так и ресивером, в зависимости от того, что введёт пользователь (s или r). Сперва к серверу надо подключить несколько ресиверов, а самым последним должен подключиться сендер, и он сразу же начнёт отправку файла. Каждый ресивер получит копию файла и сохранит её на диске C под рандомным именем.
сервер
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <fstream>
#include <boost/asio.hpp>
#include <boost/regex.hpp>
#include <cstdlib>
#include <filesystem>
#include <limits>
#include <vector>
#include <functional>
#include <memory>
#include <iterator>
#include <atomic>
 
using namespace std::chrono_literals;
using namespace std::placeholders;
using tcp = boost::asio::ip::tcp;
namespace fs = std::experimental::filesystem;
 
boost::asio::io_service io;
tcp::socket sct{ io };
tcp::acceptor acc{ io, tcp::endpoint{ tcp::v4(), 9090 } };
unsigned long long sentFileBody = 0;
boost::asio::streambuf sBuf;
std::istream istr{ &sBuf };
std::ostream ostr{ &sBuf };
std::vector<tcp::socket> vReceiver;
std::vector<boost::asio::streambuf> vBuf;
std::atomic_int ai;
 
 
void handleReadBody(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec && ec != boost::asio::error::eof)
    {
        throw std::runtime_error{ "handleReadBody() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    sentFileBody += bytesTransferred;
    if (bytesTransferred != 0)
    {
        std::string str{ std::istreambuf_iterator<char>{ istr.rdbuf() }, {} };
        for (int i = 0; i < vBuf.size(); ++i)
        {
            ostr.set_rdbuf(&vBuf.at(i));
            ostr << str;
        }
        ostr.set_rdbuf(&sBuf);
 
        void handleWrite(boost::system::error_code const&, std::size_t);
        for (int i = 0; i < vReceiver.size(); ++i)
        {
            boost::asio::async_write(vReceiver.at(i), vBuf.at(i), handleWrite);
        }
    }
    else
    {
        std::cout << "sentFileBody: " << sentFileBody << std::endl;
        std::cout << "OK" << std::endl;
    }
}
 
void handleWrite(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleWrite() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    ++ai;
    if (ai == vReceiver.size())
    {
        ai = 0;
        boost::asio::async_read(sct, sBuf, boost::asio::transfer_at_least(1), handleReadBody);
    }
}
 
void handleReadHeader(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleReadHeader() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    std::string header{ std::istreambuf_iterator<char>{ istr.rdbuf() }, {} };
    if (header.substr(0, 4) == "read")
    {
        vReceiver.emplace_back(std::move(sct));
 
        void handleAccept(boost::system::error_code const&);
        sct = tcp::socket{ io };
        acc.async_accept(sct, handleAccept);
    }
    else
    {
        if (vReceiver.empty())
        {
            throw std::runtime_error{ "handleReadHeader() : vReceiver.empty() is true" }; // к серверу не подключено ни одного ресивера
        }
        vBuf = std::vector<boost::asio::streambuf>{ vReceiver.size() };
        for (int i = 0; i < vBuf.size(); ++i)
        {
            ostr.set_rdbuf(&vBuf.at(i));
            ostr << header;
        }
        ostr.set_rdbuf(&sBuf);
        for (int i = 0; i < vReceiver.size(); ++i)
        {
            boost::asio::async_write(vReceiver.at(i), vBuf.at(i), handleWrite);
        }
    }
}
 
void handleAccept(boost::system::error_code const& ec)
{
    if (ec)
    {
        throw std::runtime_error{ "handleAccept() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    std::cout << "Client accepted\n";
    boost::asio::async_read_until(sct, sBuf, "\r\n\r\n", handleReadHeader);
}
 
void cleanup()
{
    try
    {
        sct.shutdown(tcp::socket::shutdown_both);
        sct.close();
        for (int i = 0; i < vReceiver.size(); ++i)
        {
            vReceiver.at(i).shutdown(tcp::socket::shutdown_both);
            vReceiver.at(i).close();
        }
        acc.close();
    }
    catch (std::exception const& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
}
 
int main()
{
    system("chcp 1251");
    std::cout << "Server\n";
    try
    {
        acc.async_accept(sct, handleAccept);
        io.run();
    }
    catch (std::exception const& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
 
    cleanup();
 
    system("pause");
}

клиент
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
#include <boost/asio.hpp>
#include <boost/regex.hpp>
#include <cstdlib>
#include <algorithm>
#include <filesystem>
#include <random>
#include <iterator>
 
typedef boost::asio::ip::tcp tcp;
namespace fs = std::experimental::filesystem;
 
boost::asio::io_service io;
tcp::socket sock{ io };
boost::asio::streambuf sBuf;
std::istream istr{ &sBuf };
std::size_t sizBody{ 0 };
std::ofstream ofs;
char buf[8192];
std::string header;
std::ifstream ifs;
char rw;
unsigned long long fileSize;
unsigned long long sentFileBody = 0;
 
void handleReadBody(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    auto v = ec.value();
    if (ec && ec != boost::asio::error::eof)
    {
        throw std::runtime_error{ "handleReadBody() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    sizBody += bytesTransferred;
    ofs << &sBuf;
    std::cout << "sizBody = " << sizBody << std::endl;
 
    if (sizBody != fileSize && ec != boost::asio::error::eof)
    {
        boost::asio::async_read(sock, sBuf, boost::asio::transfer_at_least(1), handleReadBody);
    }
    else if (sizBody == fileSize)
    {
        std::cout << "handleReadBody() : Transfer complete successfully" << std::endl;
    }
    else
    {
        throw std::runtime_error{ "handleReadBody() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
}
 
void handleReadHeader(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleReadHeader() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
 
    boost::smatch mr;
    boost::regex regFileName("FileName: *(.+?)\r\n");
    boost::regex regFileSize("FileSize: *([0-9]+?)\r\n");
    std::string headers{ std::istreambuf_iterator<char>{istr.rdbuf()}, {} };
    std::cout << "Headers:\n" << headers << std::endl;
    if (!boost::regex_search(headers, mr, regFileSize))
    {
        throw std::runtime_error{ "handleReadHeader() : regFileSize not found" };
    }
    fileSize = std::stoull(mr[1]);
    std::cout << "fileSize = " << fileSize << std::endl;
    if (!boost::regex_search(headers, mr, regFileName))
    {
        throw std::runtime_error{ "handleReadHeader() : regFileName not found" };
    }
    std::string fileName = mr[1];
    std::cout << "fileName = " << fileName << std::endl;
    std::string newFileName{ "0123456789" };
    std::mt19937 eng{ std::random_device{}() };
    std::shuffle(newFileName.begin(), newFileName.end(), eng);
    fs::path filePathToSave{ "c:/" + newFileName + fs::path{fileName}.extension().string() }; // принятый файл будет создан в корне диска С с рандомным именем
    ofs.open(filePathToSave, std::ios::binary);
    if (!ofs.is_open())
    {
        throw std::runtime_error{ "handleReadHeader() : Unable to open output file: " + filePathToSave.string() };
    }
 
    std::cout << "sBuf.size() = " << sBuf.size() << std::endl;
    if (sizBody != fileSize)
    {
        boost::asio::async_read(sock, sBuf, boost::asio::transfer_at_least(1), handleReadBody);
    }
    else
    {
        std::cout << "handleReadHeader() : Transfer complete successfully" << std::endl;
    }
}
 
void handleWriteBody(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleWriteBody() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    sentFileBody += bytesTransferred;
    if (ifs)
    {
        ifs.read(buf, std::size(buf));
        boost::asio::async_write(sock, boost::asio::buffer(buf, ifs.gcount()), handleWriteBody);
    }
    else
    {
        if (sentFileBody != fileSize)
        {
            throw std::runtime_error{ "handleWriteBody(): sentFileBody != fileSize\n" };
        }
        std::cout << "sentFileBody: " << sentFileBody << std::endl;
        std::cout << "OK" << std::endl;
    }
}
 
void handleWriteHeader(boost::system::error_code const& ec, std::size_t bytesTransferred)
{
    if (ec)
    {
        throw std::runtime_error{ "handleWriteHeader() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    if (rw == 'r')
    {
        boost::asio::async_read_until(sock, sBuf, "\r\n\r\n", handleReadHeader);
    }
    else
    {
        ifs.read(buf, std::size(buf));
        boost::asio::async_write(sock, boost::asio::buffer(buf, ifs.gcount()), handleWriteBody);
    }
}
 
void handleConnect(boost::system::error_code const& ec)
{
    if (ec)
    {
        throw std::runtime_error{ "handleConnect() : " + std::to_string(ec.value()) + ", " + ec.message() };
    }
    std::cout << "Connection established\nIs this client receiver (r) or sender (s)?\n"; // если ввести r то клиент будет ресивером (их может быть несколько), s - сендером
    (std::cin >> rw).ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    if (rw == 'r')
    {
        header = "read\r\n\r\n";
    }
    else
    {
        std::string filePath{ "D:/downloads/Music/1 2 3.mp4" }; // файл, который сендер отправит ресиверам
        ifs.open(filePath, std::ios::binary);
        if (!ifs.is_open())
        {
            throw std::runtime_error{ "handleConnect() : Unable to open input file: " + filePath };
        }
        fileSize = fs::file_size(filePath);
        std::cout << "fileSize: " << fileSize << std::endl;
        std::stringstream ss{ "FileName: " + fs::path{ filePath }.filename().string() + "\r\n" + "FileSize: " + std::to_string(fileSize) + "\r\n\r\n" };
        header = ss.str();
    }
    boost::asio::async_write(sock, boost::asio::buffer(header, header.size()), handleWriteHeader);
}
 
void cleanup()
{
    try
    {
        ifs.close();
        ofs.close();
        sock.shutdown(tcp::socket::shutdown_both);
        sock.close();
    }
    catch (std::exception& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
}
 
int main()
{
    system("chcp 1251");
    std::cout << "Client\n";
    try
    {
        sock.async_connect(tcp::endpoint{ boost::asio::ip::address::from_string("127.0.0.1"), 9090 }, handleConnect);
        io.run();
    }
    catch (std::exception& ex)
    {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }
 
    cleanup();
 
    system("pause");
}
1
23.01.2019, 21:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2019, 21:54
Помогаю со студенческими работами здесь

Передача файлов от клиента к клиенту, минуя сервер(как в icq).
Доброго времени суток! Имеется простенький сервер и клиент, основанные на сокетах(TClientSocket...

Передача файла html файла от сервера к клиенту
Столкнулся с проблемой передачи файла html файла от сервера к клиенту. Прошу сильно не ругать как я...

boost/asio
Который день маюсь с поиском достойного материала для изучения данной библиотеки(boost/asio) с...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда...

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта...

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru