Last active
January 7, 2016 16:18
-
-
Save mycure/60ae5d6f7d5bb3ee4ffa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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