// session class 의 정체는
// client socket에서 data를 read/write 하는 놈이다.
class session                                                              
// boost::enable_shared_from_this 이건 뭐지? 스마트 포인터 옵션인가? 
  : public boost::enable_shared_from_this<session>
{
public:
  // 생성자는 멤버 tcp::socket에 io_service를 전달하는 역할만. 
  session(boost::asio::io_service& io_service)
    : socket_(io_service)
  {
  }

  //tcp::socket을 public으로 노출시키는 것을 보니 딴데서 쓰기도 하는가보군~
  tcp::socket& socket()                                                
  {
    return socket_;
  }

  // server::handle_accept 에서 호출했던 녀석
  void start()                                                                   
  {
    //읽기 동작 역시 비동기로.. 앞서 보았던 tcp::acceptor.async_accept() 함수와 같다.
    // 단지 bind시키는 callback함수가 약간 다른 정도? 
    socket_.async_read_some(boost::asio::buffer(data_),
        make_custom_alloc_handler(allocator_,
          boost::bind(&session::handle_read,
            shared_from_this(),
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred)));
  }

  // 두 번째 파라미터로 읽은 byte size를 전달. 
  void handle_read(const boost::system::error_code& error,
      size_t bytes_transferred)
  {
    if (!error)
    {
      // data를 읽었으면, 그 다음은 바로 async_write()동작을 수행.
      // 아마 echo 서버인가보다.
      // --> 이건 뭐지? boost::asio::buffer
      // --> 이건 뭐지? make_custom_alloc_handler 
      // --> bind할 때 shared_from_this()가 들어가는 이유는....
      //     아마도 shared_ptr 내부에서는 this를 호출할 수 없어서인가보다.
      boost::asio::async_write(socket_,
          boost::asio::buffer(data_, bytes_transferred),
          make_custom_alloc_handler(allocator_,
            boost::bind(&session::handle_write,
              shared_from_this(),
              boost::asio::placeholders::error)));
    }
  }

  void handle_write(const boost::system::error_code& error)
  {
    if (!error)
    {
      socket_.async_read_some(boost::asio::buffer(data_),
          make_custom_alloc_handler(allocator_,
            boost::bind(&session::handle_read,
              shared_from_this(),
              boost::asio::placeholders::error,
              boost::asio::placeholders::bytes_transferred)));
    }
  }

private:
  // The socket used to communicate with the client.
  tcp::socket socket_;

  // Buffer used to store data received from the client.
  boost::array<char, 1024> data_;

  // The allocator to use for handler-based custom memory allocation.
  handler_allocator allocator_;
};


의문점:
    make_custom_alloc_handler 와 handler_allocator class의 관계는?

+ Recent posts