]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp17/coroutines_ts/range_based_for.cpp
5 // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #include <boost/asio/experimental/co_spawn.hpp>
12 #include <boost/asio/experimental/detached.hpp>
13 #include <boost/asio/io_context.hpp>
14 #include <boost/asio/ip/tcp.hpp>
15 #include <boost/asio/signal_set.hpp>
16 #include <boost/asio/write.hpp>
19 using boost::asio::ip::tcp
;
20 using boost::asio::experimental::awaitable
;
21 using boost::asio::experimental::co_spawn
;
22 using boost::asio::experimental::detached
;
23 namespace this_coro
= boost::asio::experimental::this_coro
;
27 friend class connections
;
28 tcp::acceptor
* acceptor_
= nullptr;
31 connection_iter(tcp::acceptor
& a
, tcp::socket s
)
32 : acceptor_(&a
), socket_(std::move(s
)) {}
35 tcp::socket
operator*()
37 return std::move(socket_
);
40 awaitable
<void> operator++()
42 auto token
= co_await
this_coro::token();
43 socket_
= co_await acceptor_
->async_accept(token
);
46 bool operator==(const connection_iter
&) const noexcept
51 bool operator!=(const connection_iter
&) const noexcept
59 tcp::acceptor
& acceptor_
;
62 explicit connections(tcp::acceptor
& a
) : acceptor_(a
) {}
64 awaitable
<connection_iter
> begin()
66 auto token
= co_await
this_coro::token();
67 tcp::socket s
= co_await acceptor_
.async_accept(token
);
68 co_return
connection_iter(acceptor_
, std::move(s
));
73 return connection_iter(acceptor_
,
74 tcp::socket(acceptor_
.get_executor().context()));
78 awaitable
<void> listener(tcp::acceptor acceptor
)
80 auto token
= co_await
this_coro::token();
82 for co_await (tcp::socket s
: connections(acceptor
))
84 co_await
boost::asio::async_write(s
, boost::asio::buffer("hello\r\n", 7), token
);
92 boost::asio::io_context
io_context(1);
94 boost::asio::signal_set
signals(io_context
, SIGINT
, SIGTERM
);
95 signals
.async_wait([&](auto, auto){ io_context
.stop(); });
97 tcp::acceptor
acceptor(io_context
, {tcp::v4(), 55555});
99 [acceptor
= std::move(acceptor
)]() mutable
101 return listener(std::move(acceptor
));
107 catch (std::exception
& e
)
109 std::printf("Exception: %s\n", e
.what());