]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/asio/test/latency/tcp_server.cpp
5 // Copyright (c) 2003-2017 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/read.hpp>
14 #include <boost/asio/write.hpp>
15 #include <boost/shared_ptr.hpp>
21 using boost::asio::ip::tcp
;
23 #include <boost/asio/yield.hpp>
25 class tcp_server
: boost::asio::coroutine
28 tcp_server(tcp::acceptor
& acceptor
, std::size_t buf_size
) :
30 socket_(acceptor_
.get_executor().context()),
35 void operator()(boost::system::error_code ec
, std::size_t n
= 0)
37 reenter (this) for (;;)
39 yield acceptor_
.async_accept(socket_
, ref(this));
43 yield
boost::asio::async_read(socket_
,
44 boost::asio::buffer(buffer_
), ref(this));
48 for (std::size_t i
= 0; i
< n
; ++i
) buffer_
[i
] = ~buffer_
[i
];
50 yield
boost::asio::async_write(socket_
,
51 boost::asio::buffer(buffer_
), ref(this));
61 explicit ref(tcp_server
* p
)
66 void operator()(boost::system::error_code ec
, std::size_t n
= 0)
76 tcp::acceptor
& acceptor_
;
78 std::vector
<unsigned char> buffer_
;
79 tcp::endpoint sender_
;
82 #include <boost/asio/unyield.hpp>
84 int main(int argc
, char* argv
[])
89 "Usage: tcp_server <port> <nconns> "
90 "<bufsize> {spin|block}\n");
94 unsigned short port
= static_cast<unsigned short>(std::atoi(argv
[1]));
95 int max_connections
= std::atoi(argv
[2]);
96 std::size_t buf_size
= std::atoi(argv
[3]);
97 bool spin
= (std::strcmp(argv
[4], "spin") == 0);
99 boost::asio::io_context
io_context(1);
100 tcp::acceptor
acceptor(io_context
, tcp::endpoint(tcp::v4(), port
));
101 std::vector
<boost::shared_ptr
<tcp_server
> > servers
;
103 for (int i
= 0; i
< max_connections
; ++i
)
105 boost::shared_ptr
<tcp_server
> s(new tcp_server(acceptor
, buf_size
));
106 servers
.push_back(s
);
107 (*s
)(boost::system::error_code());
111 for (;;) io_context
.poll();