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
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
Esta mensagem pode conter informação confidencial e/ou privilegiada. Se você não for o destinatário ou a pessoa autorizada a receber esta mensagem, não deverá utilizar, copiar, alterar, divulgar a informação nela contida ou tomar qualquer ação baseada nessas informações. Se você recebeu esta mensagem por engano, por favor avise imediatamente o remetente, respondendo o e-mail e em seguida apague-o. Agradecemos sua cooperação.
This message may contain confidential and/or privileged information. If you are not the addressee or authorized to receive this for the addressee, you must not use, copy, disclose, change, take any action based on this message or any information herein. If you have received this message in error, please advise the sender immediately by reply e-mail and delete this message. Thank you for your cooperation.