@@ -142,27 +142,25 @@ TCP-соединение представляет собой двунаправ
142142
143143Теперь давайте взглянем на следующий [ исходный код] ( ./code/simple_server.cpp ) :
144144
145-
146-
147145``` cpp
148146#include < boost/asio.hpp>
149147
150148int main () {
151- std::uint16_t port = 15001;
152-
153- boost::asio::io_context io_context;
154- boost::asio::ip::udp::endpoint receiver(boost::asio::ip::udp::v4(), port);
155- boost::asio::ip::udp::socket socket(io_context, receiver);
156-
157- while (true) {
158- char buffer[ 65536] ;
159- boost::asio::ip::udp::endpoint sender;
160- std::size_t bytes_transferred =
161- socket.receive_from(boost::asio::buffer(buffer), sender);
162- socket.send_to(boost::asio::buffer(buffer, bytes_transferred), sender);
163- }
149+ std::uint16_t port = 15001;
150+
151+ boost::asio::io_context io_context;
152+ boost::asio::ip::udp::endpoint receiver(boost::asio::ip::udp::v4(), port);
153+ boost::asio::ip::udp::socket socket(io_context, receiver);
154+
155+ while (true) {
156+ char buffer[65536];
157+ boost::asio::ip::udp::endpoint sender;
158+ std::size_t bytes_transferred =
159+ socket.receive_from(boost::asio::buffer(buffer), sender);
160+ socket.send_to(boost::asio::buffer(buffer, bytes_transferred), sender);
161+ }
164162
165- return 0;
163+ return 0;
166164}
167165```
168166
@@ -252,9 +250,9 @@ socket.async_receive_from(
252250 buffer,
253251 sender,
254252 [&](boost::system::error_code error, std::size_t bytes_transferred) {
255- // Эта лямбда-функция будет вызвана после получения сообщения
256- std::cout << "Message is received, message size is "
257- << bytes_transferred;
253+ // Эта лямбда-функция будет вызвана после получения сообщения
254+ std::cout << "Message is received, message size is "
255+ << bytes_transferred;
258256 });
259257```
260258
@@ -280,69 +278,67 @@ socket.async_receive_from(
280278- Выводить полученные данные в стандартный вывод.
281279- Закрывать соединение.
282280
283-
284281Теперь давайте взглянем на полноценный пример такого сервера. Ниже мы все
285282разложим по полочкам и посмотрим как все устроено. Как и прежде, мы
286- пренебрегаем обработкой ошибок, чтобы код выглядел более понятным. Об
287- обработке ошибок мы поговорим позже.
283+ пренебрегаем обработкой ошибок, чтобы код выглядел более понятным. Об обработке
284+ ошибок мы поговорим позже.
288285
289286```cpp
290287#include <boost/asio.hpp>
291-
292288#include <iostream>
293289#include <optional>
294290
295291class session: public std::enable_shared_from_this<session> {
296- public:
297- session(boost::asio::ip::tcp::socket&& socket) :
298- socket(std::move(socket)) {}
292+ public:
293+ session(boost::asio::ip::tcp::socket&& socket) :
294+ socket(std::move(socket)) {}
299295
300- void start() {
301- boost::asio::async_read_until(
302- socket,
303- streambuf,
304- '\n',
305- [self = shared_from_this()](
306- boost::system::error_code error,
307- std::size_t bytes_transferred) {
308- std::cout << std::istream(&self->streambuf).rdbuf();
309- });
310- }
296+ void start() {
297+ boost::asio::async_read_until(
298+ socket,
299+ streambuf,
300+ '\n',
301+ [self = shared_from_this()](
302+ boost::system::error_code error,
303+ std::size_t bytes_transferred) {
304+ std::cout << std::istream(&self->streambuf).rdbuf();
305+ });
306+ }
311307
312- private:
313- boost::asio::ip::tcp::socket socket;
314- boost::asio::streambuf streambuf;
308+ private:
309+ boost::asio::ip::tcp::socket socket;
310+ boost::asio::streambuf streambuf;
315311};
316312
317313class server {
318- public:
319- server(boost::asio::io_context& io_context, std::uint16_t port) :
320- io_context(io_context),
321- acceptor(
322- io_context,
323- boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)) {}
324-
325- void async_accept() {
326- socket.emplace(io_context);
327-
328- acceptor.async_accept(*socket, [&](boost::system::error_code error) {
329- std::make_shared<session>(std::move(*socket))->start();
330- async_accept();
331- });
332- }
314+ public:
315+ server(boost::asio::io_context& io_context, std::uint16_t port) :
316+ io_context(io_context),
317+ acceptor(
318+ io_context,
319+ boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)) {}
320+
321+ void async_accept() {
322+ socket.emplace(io_context);
323+
324+ acceptor.async_accept(*socket, [&](boost::system::error_code error) {
325+ std::make_shared<session>(std::move(*socket))->start();
326+ async_accept();
327+ });
328+ }
333329
334- private:
335- boost::asio::io_context& io_context;
336- boost::asio::ip::tcp::acceptor acceptor;
337- std::optional<boost::asio::ip::tcp::socket> socket;
330+ private:
331+ boost::asio::io_context& io_context;
332+ boost::asio::ip::tcp::acceptor acceptor;
333+ std::optional<boost::asio::ip::tcp::socket> socket;
338334};
339335
340336int main() {
341- boost::asio::io_context io_context;
342- server srv(io_context, 15001);
343- srv.async_accept();
344- io_context.run();
345- return 0;
337+ boost::asio::io_context io_context;
338+ server srv(io_context, 15001);
339+ srv.async_accept();
340+ io_context.run();
341+ return 0;
346342}
347343```
348344
@@ -358,11 +354,11 @@ int main() {
358354` io_context.run() ` . Давайте взглянем на функцию ` main ` :
359355``` cpp
360356int main () {
361- boost::asio::io_context io_context;
362- server srv(io_context, 15001);
363- srv.async_accept();
364- io_context.run();
365- return 0;
357+ boost::asio::io_context io_context;
358+ server srv(io_context, 15001);
359+ srv.async_accept();
360+ io_context.run();
361+ return 0;
366362}
367363```
368364
@@ -396,9 +392,9 @@ acceptor(io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),
396392Теперь давайте рассмотрим вызов функцию `async_accept` у `acceptor`:
397393```cpp
398394acceptor.async_accept(*socket, [&](boost::system::error_code error) {
399- std::make_shared<session>(std::move(*socket))->start();
400- async_accept();
401- });
395+ std::make_shared<session>(std::move(*socket))->start();
396+ async_accept();
397+ });
402398```
403399
404400Словами это можно описать так: «Ожидай входящее соединение, а после того как
@@ -425,15 +421,15 @@ acceptor.async_accept(*socket, [&](boost::system::error_code error) {
425421набор функций, связанный с соединением. Давайте рассмотрим функцию ` start ` :
426422``` cpp
427423void start () {
428- boost::asio::async_read_until (
429- socket,
430- streambuf,
431- '\n',
432- [self = shared_from_this()](
433- boost::system::error_code error,
434- std::size_t bytes_transferred) {
435- std::cout << std::istream(&self->streambuf).rdbuf();
436- });
424+ boost::asio::async_read_until (
425+ socket,
426+ streambuf,
427+ '\n',
428+ [self = shared_from_this()](
429+ boost::system::error_code error,
430+ std::size_t bytes_transferred) {
431+ std::cout << std::istream(&self->streambuf).rdbuf();
432+ });
437433}
438434```
439435
@@ -482,7 +478,6 @@ Hello asio!
482478Boost.Asio. Поздравляем!
483479
484480
485-
486481# Обработка ошибок
487482
488483
@@ -582,17 +577,17 @@ size)`.
582577socket.async_receive(
583578 buffer,
584579 [&](boost::system::error_code error, std::size_t bytes_transferred) {
585- if (!error) {
586- // Асинхронная операция выполнена успешно.
587- // Соединение все еще установлено
588- } else if (error == boost::asio::error::eof) {
589- // Соединение было разорвано.
590- // В буфере по-прежнему хранятся полученные данные,
591- // численно равные `bytes_transferred` (в байтах)
592- } else {
593- // Что-то пошло не так
594- std::cerr << error.message() << "\n";
595- }
580+ if (!error) {
581+ // Асинхронная операция выполнена успешно.
582+ // Соединение все еще установлено
583+ } else if (error == boost::asio::error::eof) {
584+ // Соединение было разорвано.
585+ // В буфере по-прежнему хранятся полученные данные,
586+ // численно равные `bytes_transferred` (в байтах)
587+ } else {
588+ // Что-то пошло не так
589+ std::cerr << error.message() << "\n";
590+ }
596591 });
597592```
598593
@@ -640,7 +635,7 @@ std::cout << "Remote endpoint: " << endpoint << "\n";
640635
641636Если запустить этот код, вы скорее всего увидите что-то на подобии этого:
642637``` sh
643- Remote endpoint: 127.0.0.1:38529
638+ Remote endpoint: 127.0.0.1:38529
644639```
645640
646641Иногда вам может понадобиться отменить асинхронную операцию, которая была
@@ -1054,10 +1049,10 @@ class server {
10541049 srv.broadcast("We have a newcomer");
10551050 });
10561051
1057- srv.on_leave([&] { srv.broadcast("We are one less"); })
1052+ srv.on_leave([&] { srv.broadcast("We are one less"); });
10581053
1059- srv.on_message(
1060- [&](message_type const& message) { srv.broadcast(message); })
1054+ srv.on_message(
1055+ [&](message_type const& message) { srv.broadcast(message); });
10611056 }
10621057
10631058 void start () {
0 commit comments