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