Advertisement
Guest User

Untitled

a guest
May 23rd, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <memory>
  4. #include <utility>
  5. #include <boost/asio.hpp>
  6.  
  7. using boost::asio::ip::tcp;
  8.  
  9. class Session : public std::enable_shared_from_this<Session> {
  10.  public:
  11.   Session(tcp::socket socket): socket_(std::move(socket)) {
  12.  
  13.   }
  14.  
  15.   void start() {
  16.     do_read();
  17.   }
  18.  
  19.  private:
  20.   void do_read() {
  21.     auto self(shared_from_this());
  22.     socket_.async_read_some(boost::asio::buffer(data_, max_length),
  23.       [this, self](boost::system::error_code ec, std::size_t length) {
  24.         if (!ec) {
  25.           do_write(length);
  26.         }
  27.       }
  28.     );
  29.   }
  30.  
  31.   void do_write(std::size_t length) {
  32.     auto self(shared_from_this());
  33.     boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
  34.       [this, self](boost::system::error_code ec, std::size_t) {
  35.         if (!ec) {
  36.           do_read();
  37.         }
  38.       }
  39.     );
  40.   }
  41.  
  42.   tcp::socket socket_;
  43.   enum { max_length = 1024 };
  44.   char data_[max_length];
  45. };
  46.  
  47. class Server {
  48.  public:
  49.   Server(boost::asio::io_service& io_service, short port)
  50.     : acceptor_(io_service, tcp::endpoint(tcp::v4(), port)),
  51.       socket_(io_service) {
  52.     do_accept();
  53.   }
  54.  
  55.  private:
  56.   void do_accept() {
  57.     acceptor_.async_accept(socket_,
  58.       [this](boost::system::error_code ec) {
  59.         if (!ec) {
  60.           std::make_shared<Session>(std::move(socket_))->start();
  61.         }
  62.         do_accept();
  63.       }
  64.     );
  65.   }
  66.  
  67.   tcp::acceptor acceptor_;
  68.   tcp::socket socket_;
  69. };
  70.  
  71. int main(int argc, char const *argv[])
  72. {
  73.   try {
  74.     if (argc != 2) {
  75.       std::cerr << "Usage: async_tcp_echo_server <port>\n";
  76.       return 1;
  77.     }
  78.  
  79.     boost::asio::io_service io_service;
  80.     Server s(io_service, std::atoi(argv[1]));
  81.  
  82.     io_service.run();
  83.   } catch (std::exception& e) {
  84.     std::cerr << "Exception: " << e.what() << "\n";
  85.   }
  86.   return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement