Hi,

 

I am using Asio in Boost version  1.36.0 and I have a question regarding recursive call to a completion handler. I have implemented a class similar to the one from the examples of asio acceptor.

 

I would like to know if there is a way to recursively call handle_accept () within handle_accept() and break on condition when the socket is closed. (Please see my comment in the code ). Does Asio allow such implementation or is there another way to handle this condition.

 

#include "server.hpp"

#include <boost/bind.hpp>

 

namespace http {

namespace server2 {

 

server::server(const std::string& address, const std::string& port,

    const std::string& doc_root, std::size_t io_service_pool_size)

  : io_service_pool_(io_service_pool_size),

    acceptor_(io_service_pool_.get_io_service()),

    new_connection_(new connection(

          io_service_pool_.get_io_service(), request_handler_)),

    request_handler_(doc_root)

{

  // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).

  boost::asio::ip::tcp::resolver resolver(acceptor_.io_service());

  boost::asio::ip::tcp::resolver::query query(address, port);

  boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);

  acceptor_.open(endpoint.protocol());

  acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));

  acceptor_.bind(endpoint);

  acceptor_.listen();

  acceptor_.async_accept(new_connection_->socket(),

      boost::bind(&server::handle_accept, this,

        boost::asio::placeholders::error));

}

 

void server::run()

{

  io_service_pool_.run();

}

 

void server::stop()

{

  io_service_pool_.stop();

}

 

void server::handle_accept(const boost::system::error_code& e)

{

  if (!e)

  {

    new_connection_->start();

    acceptor_.async_accept(new_connection_->socket(),

        boost::bind(&server::handle_accept, this,

          boost::asio::placeholders::error));

//Need to call handle_accept again here

e.g. boost::bind(&server::handle_accept, this,

          boost::asio::placeholders::error));

 

  }

}

 

} // namespace server2

} // namespace http

 

Thanks,

 

Anuit