gpt4 book ai didi

c++ - io_service 在 TCP/IP 套接字中的作用 - 需要帮助理解

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:32 25 4
gpt4 key购买 nike

当谈到 TCP/IP 套接字时,我很难理解 io_service 的作用。这是我对io_service的基本理解。 io_service->run() block 和接受工作请求(我们使用 io_service::work)到 postdispatchio_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更好地理解它在异步操作中的作用

asynchronous connect

你不需要 io_service::work对象以防止 io_service::run() 立即返回。在您的情况下,您已经为 io_service 提供了与 async_accept() 相关的工作,并且可能在 OnAccept() 中与另一个工作相关async_accept() 调用。

还有其他几个有用的answers对于关于 SO 的类似问题,您可能会觉得有帮助。

关于c++ - io_service 在 TCP/IP 套接字中的作用 - 需要帮助理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15558900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com