| // http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp | |
| // | |
| // async_tcp_echo_server.cpp | |
| // ~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| // | |
| // Copyright (c) 2003-2015 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 <cstdlib> | |
| #include <iostream> | |
| #include <memory> | |
| #include <utility> | |
| #include <boost/asio.hpp> | |
| using boost::asio::ip::tcp; | |
| class session | |
| : public std::enable_shared_from_this<session> | |
| { | |
| public: | |
| session(tcp::socket socket) | |
| : socket_(std::move(socket)) | |
| { | |
| } | |
| void start() | |
| { | |
| do_read(); | |
| } | |
| private: | |
| void do_read() | |
| { | |
| auto self(shared_from_this()); | |
| socket_.async_read_some(boost::asio::buffer(data_, max_length), | |
| [this, self](boost::system::error_code ec, std::size_t length) | |
| { | |
| if (!ec) | |
| { | |
| do_write(length); | |
| } | |
| }); | |
| } | |
| void do_write(std::size_t length) | |
| { | |
| auto self(shared_from_this()); | |
| boost::asio::async_write(socket_, boost::asio::buffer(data_, length), | |
| [this, self](boost::system::error_code ec, std::size_t /*length*/) | |
| { | |
| if (!ec) | |
| { | |
| do_read(); | |
| } | |
| }); | |
| } | |
| tcp::socket socket_; | |
| enum { max_length = 1024 }; | |
| char data_[max_length]; | |
| }; | |
| class server | |
| { | |
| public: | |
| server(boost::asio::io_service& io_service, short port) | |
| : acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), | |
| socket_(io_service) | |
| { | |
| do_accept(); | |
| } | |
| private: | |
| void do_accept() | |
| { | |
| acceptor_.async_accept(socket_, | |
| [this](boost::system::error_code ec) | |
| { | |
| if (!ec) | |
| { | |
| std::make_shared<session>(std::move(socket_))->start(); | |
| } | |
| do_accept(); | |
| }); | |
| } | |
| tcp::acceptor acceptor_; | |
| tcp::socket socket_; | |
| }; | |
| int main(int argc, char* argv[]) | |
| { | |
| try | |
| { | |
| if (argc != 2) | |
| { | |
| std::cerr << "Usage: async_tcp_echo_server <port>\n"; | |
| return 1; | |
| } | |
| boost::asio::io_service io_service; | |
| server s(io_service, std::atoi(argv[1])); | |
| io_service.run(); | |
| } | |
| catch (std::exception& e) | |
| { | |
| std::cerr << "Exception: " << e.what() << "\n"; | |
| } | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment