]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/asio/test/latency/tcp_server.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / asio / test / latency / tcp_server.cpp
CommitLineData
7c673cae
FG
1//
2// tcp_server.cpp
3// ~~~~~~~~~~~~~~
4//
b32b8144 5// Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7c673cae
FG
6//
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)
9//
10
b32b8144 11#include <boost/asio/io_context.hpp>
7c673cae
FG
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>
16#include <cstdio>
17#include <cstdlib>
18#include <cstring>
19#include <vector>
20
21using boost::asio::ip::tcp;
22
b32b8144 23#include <boost/asio/yield.hpp>
7c673cae 24
b32b8144 25class tcp_server : boost::asio::coroutine
7c673cae
FG
26{
27public:
28 tcp_server(tcp::acceptor& acceptor, std::size_t buf_size) :
29 acceptor_(acceptor),
b32b8144 30 socket_(acceptor_.get_executor().context()),
7c673cae
FG
31 buffer_(buf_size)
32 {
33 }
34
35 void operator()(boost::system::error_code ec, std::size_t n = 0)
36 {
37 reenter (this) for (;;)
38 {
39 yield acceptor_.async_accept(socket_, ref(this));
40
41 while (!ec)
42 {
43 yield boost::asio::async_read(socket_,
44 boost::asio::buffer(buffer_), ref(this));
45
46 if (!ec)
47 {
48 for (std::size_t i = 0; i < n; ++i) buffer_[i] = ~buffer_[i];
49
50 yield boost::asio::async_write(socket_,
51 boost::asio::buffer(buffer_), ref(this));
52 }
53 }
54
55 socket_.close();
56 }
57 }
58
59 struct ref
60 {
61 explicit ref(tcp_server* p)
62 : p_(p)
63 {
64 }
65
66 void operator()(boost::system::error_code ec, std::size_t n = 0)
67 {
68 (*p_)(ec, n);
69 }
70
71 private:
72 tcp_server* p_;
73 };
74
75private:
76 tcp::acceptor& acceptor_;
77 tcp::socket socket_;
78 std::vector<unsigned char> buffer_;
79 tcp::endpoint sender_;
80};
81
b32b8144 82#include <boost/asio/unyield.hpp>
7c673cae
FG
83
84int main(int argc, char* argv[])
85{
86 if (argc != 5)
87 {
88 std::fprintf(stderr,
89 "Usage: tcp_server <port> <nconns> "
90 "<bufsize> {spin|block}\n");
91 return 1;
92 }
93
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);
98
b32b8144
FG
99 boost::asio::io_context io_context(1);
100 tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port));
7c673cae
FG
101 std::vector<boost::shared_ptr<tcp_server> > servers;
102
103 for (int i = 0; i < max_connections; ++i)
104 {
105 boost::shared_ptr<tcp_server> s(new tcp_server(acceptor, buf_size));
106 servers.push_back(s);
107 (*s)(boost::system::error_code());
108 }
109
110 if (spin)
b32b8144 111 for (;;) io_context.poll();
7c673cae 112 else
b32b8144 113 io_context.run();
7c673cae 114}