]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp17/coroutines_ts/range_based_for.cpp
5 // Copyright (c) 2003-2019 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/co_spawn.hpp>
12 #include <boost/asio/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::awaitable
;
21 using boost::asio::co_spawn
;
22 using boost::asio::detached
;
23 using boost::asio::use_awaitable
;
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 socket_
= co_await acceptor_
->async_accept(use_awaitable
);
45 bool operator==(const connection_iter
&) const noexcept
50 bool operator!=(const connection_iter
&) const noexcept
58 tcp::acceptor
& acceptor_
;
61 explicit connections(tcp::acceptor
& a
) : acceptor_(a
) {}
63 awaitable
<connection_iter
> begin()
65 tcp::socket s
= co_await acceptor_
.async_accept(use_awaitable
);
66 co_return
connection_iter(acceptor_
, std::move(s
));
71 return connection_iter(acceptor_
,
72 tcp::socket(acceptor_
.get_executor()));
76 awaitable
<void> listener(tcp::acceptor acceptor
)
78 for co_await (tcp::socket s
: connections(acceptor
))
80 co_await
boost::asio::async_write(s
, boost::asio::buffer("hello\r\n", 7), use_awaitable
);
88 boost::asio::io_context
io_context(1);
90 boost::asio::signal_set
signals(io_context
, SIGINT
, SIGTERM
);
91 signals
.async_wait([&](auto, auto){ io_context
.stop(); });
93 tcp::acceptor
acceptor(io_context
, {tcp::v4(), 55555});
95 [acceptor
= std::move(acceptor
)]() mutable
97 return listener(std::move(acceptor
));
103 catch (std::exception
& e
)
105 std::printf("Exception: %s\n", e
.what());