对于TCP / IP套接字,我很难理解io_service的作用。这是我对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
中。这里到底发生了什么?任何澄清这一点的解释将不胜感激。 最佳答案
首先,您的简单服务器代码看起来不错。 io_service
就是这样,它为I / O操作提供服务。研究Asio anatomy有助于更好地了解其在异步操作中的作用。
您不需要 io_service::work
对象来防止io_service::run()
立即返回。在您的情况下,您已将io_service
的工作与async_accept()
进行了关联,并且可能通过另一个OnAccept()
调用在async_accept()
中进行了更多的工作。
对于SO上类似的问题,还有其他有用的answers,您可能会发现有帮助。
关于c++ - io_service在TCP/IP套接字中的作用-需要帮助了解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15558900/