c++ - boost::asio endless loop of system:9 error after first connection -
i have server, using asio next code, 100% copied examples. code behaves when there no connections. however, first client connects, handle take starts output vast amounts of system:9 errors , unable connect other clients. single client connected can perform async read/writes fine. i'm @ loss @ i'm doing incorrectly. i've tried code , without io_service in thread pool same results.
server::server(io_service& io_service, const std::string address, const std::string port) : io_service_(io_service), //zmq_strand_(io_service), acceptor_(io_service) { ip::tcp::resolver resolver(io_service_); ip::tcp::resolver::query query(address, port); ip::tcp::endpoint endpoint = *resolver.resolve(query); acceptor_.open(endpoint.protocol()); acceptor_.set_option(ip::tcp::acceptor::reuse_address(true)); acceptor_.bind(endpoint); acceptor_.listen(); start_accept(); } void server::start_accept() { auto session = std::shared_ptr<session>(new session(io_service_,session_manager_)); acceptor_.async_accept(session->socket() ,std::bind(&server::handle_accept,this,session,std::placeholders::_1)); } void server::handle_accept(std::shared_ptr<session> session, const system::error_code& error) { if (!error) { std::cout << "handle_accept" << std::endl; session->start(); } else { std::cout << error << std::endl; } start_accept(); } small update: instead of using http3 illustration used illustration denis proposed. it's less convoluted , made server behave correctly. haven't found rational explanation why previous piece of code doesn't work. does:
server::server( io_service &service, const uint8_t num_threads, const std::string address, const uint16_t port) : num_threads_(num_threads), //zmq_strand_(io_service), acceptor_(service,ip::tcp::endpoint(ip::tcp::v4(),port)) { //io_service::work work(io_service_); start_accept(); } void server::start_accept() { auto session = std::shared_ptr<session>(new session(acceptor_.get_io_service(),session_manager_)); acceptor_.async_accept(session->socket() ,std::bind(&server::handle_accept,this,session,std::placeholders::_1)); } void server::handle_accept(std::shared_ptr<session> session, const system::error_code& error) { if (!error) { std::cout << "handle_accept" << std::endl; session->start(); } start_accept(); } void server::start() { std::set<std::unique_ptr<std::thread>> threads; for( unsigned int = 0; < num_threads_; ++i ) { threads.insert(std::unique_ptr<std::thread>(new std::thread( [&]() { acceptor_.get_io_service().run(); }) )); } std::cout << threads.size() << " threads started" << std::endl; for(auto &t:threads) { t->join(); } std::cout << threads.size() << " threads joined" << std::endl; }
look exactly @ tutorial , compare code tutorial: boost tcp async server example
c++ boost boost-asio
No comments:
Post a Comment