typedef boost::shared_ptr<session> session_ptr;

class server
{
public:
  server(boost::asio::io_service& io_service, short port)
    : io_service_(io_service),
      acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
  {
    session_ptr new_session(new session(io_service_));
    // 비동기로 accept 되면,
    // 단 한번만 callback을 호출하는걸 알 수 있다. 
    // 왜냐면, callback 에서 또 async_accept() 하니까 
    acceptor_.async_accept(new_session->socket(),
        boost::bind(&server::handle_accept, this, new_session,
          boost::asio::placeholders::error));
  }

  void handle_accept(session_ptr new_session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      // session은 이 때 시작된다.
      // 자세한 동작은 다음 글에서... 
      new_session->start();
    }
 
    // shared_ptr.reset()을 호출해서 새 session을 만들고 있다.
    new_session.reset(new session(io_service_));                       
 
    // 다음 연결을 accept하러 고고싱~
    // 서버는 죽어라 session만 만드는구나... 
    acceptor_.async_accept(new_session->socket(),
        boost::bind(&server::handle_accept, this, new_session,
          boost::asio::placeholders::error));
  }

private:
  boost::asio::io_service& io_service_;
  tcp::acceptor acceptor_;
};


결론:
    . server class는 C의 socket(), accept(), listen()을 사용한 전통적인 서버와 비슷한 역할을 한다.

의문점:
    . session class의 정체
        . socket인 것 같다. 
        . 다음 글에 설명한다.
    . session은 언제 소멸되나?
        . 연결이 종료되면 알아서???

 

+ Recent posts