Мне трудно понять роль io_service, когда речь идет о сокетах TCP/IP. Вот мое основное понимание io_service. io_service->run()
блокирует и принимает рабочие запросы (мы используем io_service::work
) для post
или dispatch
работы для io_service
. Я прав здесь? Пожалуйста, дайте мне знать, если я что-то упустил? Ниже приведен мой код для простого сервера.
void RunServer()
{
boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
boost::shared_ptr< boost::asio::ip::tcp::acceptor > acceptor(new boost::asio::ip::tcp::acceptor( *io_service ));
boost::shared_ptr< boost::asio::ip::tcp::socket > sock( new boost::asio::ip::tcp::socket( *io_service ) );
try
{
boost::asio::ip::tcp::resolver resolver( *io_service );
boost::asio::ip::tcp::resolver::query query( "127.0.0.1", boost::lexical_cast< std::string >( 7777 ));
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve( query );
acceptor->open( endpoint.protocol() );
acceptor->set_option( boost::asio::ip::tcp::acceptor::reuse_address( false ) );
acceptor->bind( endpoint );
acceptor->listen( boost::asio::socket_base::max_connections );
acceptor->async_accept( *sock, boost::bind( OnAccept, _1, sock ) );//Receives only one connection
std::cout << "Waiting for incoming connections \n";
io_service->run(); //Confusion here --- Line A
}
catch( std::exception & ex )
{
std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;
}
}
Теперь я знаю, что если к io_service не подключен рабочий объект, метод io_service->run()
никогда не заблокируется, верно? Теперь мой вопрос заключается в том, какую роль играет io_service->run()
выше. Из экспериментов я понял, что если я удаляю код, метод OnAccept
не вызывается. Также, где работа добавляется к io_service
здесь. Что именно здесь происходит? Любое объяснение, которое проясняет это, будет оценено.