]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/example/cpp03/spawn/echo_server.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/io_context.hpp>
12 #include <boost/asio/ip/tcp.hpp>
13 #include <boost/asio/spawn.hpp>
14 #include <boost/asio/steady_timer.hpp>
15 #include <boost/asio/write.hpp>
16 #include <boost/bind.hpp>
17 #include <boost/shared_ptr.hpp>
18 #include <boost/enable_shared_from_this.hpp>
21 using boost::asio::ip::tcp
;
23 class session
: public boost::enable_shared_from_this
<session
>
26 explicit session(boost::asio::io_context
& io_context
)
27 : strand_(boost::asio::make_strand(io_context
)),
40 boost::asio::spawn(strand_
,
41 boost::bind(&session::echo
,
42 shared_from_this(), _1
));
43 boost::asio::spawn(strand_
,
44 boost::bind(&session::timeout
,
45 shared_from_this(), _1
));
49 void echo(boost::asio::yield_context yield
)
56 timer_
.expires_after(boost::asio::chrono::seconds(10));
57 std::size_t n
= socket_
.async_read_some(boost::asio::buffer(data
), yield
);
58 boost::asio::async_write(socket_
, boost::asio::buffer(data
, n
), yield
);
61 catch (std::exception
& e
)
68 void timeout(boost::asio::yield_context yield
)
70 while (socket_
.is_open())
72 boost::system::error_code ignored_ec
;
73 timer_
.async_wait(yield
[ignored_ec
]);
74 if (timer_
.expiry() <= boost::asio::steady_timer::clock_type::now())
79 boost::asio::strand
<boost::asio::io_context::executor_type
> strand_
;
81 boost::asio::steady_timer timer_
;
84 void do_accept(boost::asio::io_context
& io_context
,
85 unsigned short port
, boost::asio::yield_context yield
)
87 tcp::acceptor
acceptor(io_context
, tcp::endpoint(tcp::v4(), port
));
91 boost::system::error_code ec
;
92 boost::shared_ptr
<session
> new_session(new session(io_context
));
93 acceptor
.async_accept(new_session
->socket(), yield
[ec
]);
94 if (!ec
) new_session
->go();
98 int main(int argc
, char* argv
[])
104 std::cerr
<< "Usage: echo_server <port>\n";
108 boost::asio::io_context io_context
;
110 boost::asio::spawn(io_context
,
111 boost::bind(do_accept
,
112 boost::ref(io_context
), atoi(argv
[1]), _1
));
116 catch (std::exception
& e
)
118 std::cerr
<< "Exception: " << e
.what() << "\n";