From ff01b716711b97c2fcaa709ea97f7650f106aa10 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 7 Oct 2016 14:13:19 +0200 Subject: Added ASIO networking library (nw) --- 3rdparty/asio/src/tests/latency/tcp_server.cpp | 114 +++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 3rdparty/asio/src/tests/latency/tcp_server.cpp (limited to '3rdparty/asio/src/tests/latency/tcp_server.cpp') diff --git a/3rdparty/asio/src/tests/latency/tcp_server.cpp b/3rdparty/asio/src/tests/latency/tcp_server.cpp new file mode 100644 index 00000000000..2bbdfdc17b0 --- /dev/null +++ b/3rdparty/asio/src/tests/latency/tcp_server.cpp @@ -0,0 +1,114 @@ +// +// tcp_server.cpp +// ~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using asio::ip::tcp; + +#include "yield.hpp" + +class tcp_server : coroutine +{ +public: + tcp_server(tcp::acceptor& acceptor, std::size_t buf_size) : + acceptor_(acceptor), + socket_(acceptor_.get_executor().context()), + buffer_(buf_size) + { + } + + void operator()(asio::error_code ec, std::size_t n = 0) + { + reenter (this) for (;;) + { + yield acceptor_.async_accept(socket_, ref(this)); + + while (!ec) + { + yield asio::async_read(socket_, + asio::buffer(buffer_), ref(this)); + + if (!ec) + { + for (std::size_t i = 0; i < n; ++i) buffer_[i] = ~buffer_[i]; + + yield asio::async_write(socket_, + asio::buffer(buffer_), ref(this)); + } + } + + socket_.close(); + } + } + + struct ref + { + explicit ref(tcp_server* p) + : p_(p) + { + } + + void operator()(asio::error_code ec, std::size_t n = 0) + { + (*p_)(ec, n); + } + + private: + tcp_server* p_; + }; + +private: + tcp::acceptor& acceptor_; + tcp::socket socket_; + std::vector buffer_; + tcp::endpoint sender_; +}; + +#include "unyield.hpp" + +int main(int argc, char* argv[]) +{ + if (argc != 5) + { + std::fprintf(stderr, + "Usage: tcp_server " + " {spin|block}\n"); + return 1; + } + + unsigned short port = static_cast(std::atoi(argv[1])); + int max_connections = std::atoi(argv[2]); + std::size_t buf_size = std::atoi(argv[3]); + bool spin = (std::strcmp(argv[4], "spin") == 0); + + asio::io_context io_context(1); + tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port)); + std::vector > servers; + + for (int i = 0; i < max_connections; ++i) + { + boost::shared_ptr s(new tcp_server(acceptor, buf_size)); + servers.push_back(s); + (*s)(asio::error_code()); + } + + if (spin) + for (;;) io_context.poll(); + else + io_context.run(); +} -- cgit v1.2.3-70-g09d2