C++:boost::asio:async_resolve() 不起作用(使用 lambda 函数),但 resolve() 起作用
C++: boost::asio: async_resolve() doesn't work (with lambda functions), but resolve() works
基于this示例,我的程序有这个同步初始化部分:
io_service = new boost::asio::io_service;
resolver = new boost::asio::ip::tcp::resolver(*io_service);
query = new boost::asio::ip::tcp::resolver::query(data.serverAddress.c_str(),data.serverPort.c_str());
iterator = resolver->resolve(*query);
//...
现在这可以正常工作,没有任何问题,除了如果没有连接,调用 resolver->resolve(*query);
会无限阻塞。为了解决这个问题,我决定改用 resolver->async_resolve(*query);
。所以我写了下面的代码来与lambda函数同步,所以下面的代码替换了之前代码的最后一句:
boost::system::error_code queryError;
boost::function<void(const boost::system::error_code&,const boost::asio::ip::tcp::resolver::iterator&)> queryLambda =
[&querySuccess,&queryError,this]
(const boost::system::error_code& errorCode, const boost::asio::ip::tcp::resolver::iterator& it)
{std::cout<<"Success!"<<std::endl;querySuccess=1;iterator=it;queryError=errorCode;};
resolver->async_resolve(*query,queryLambda);
int timeout = 10000;
int totalTime = 0;
int timeWaitStep = 1000;
while(true)
{
std::cout<<"Trying to connect..."<<std::endl;
sleep(timeWaitStep);
if(querySuccess)
{
break;
}
else
{
totalTime += timeWaitStep;
std::cout<<totalTime<<std::endl;
if(totalTime > timeout)
{
throw std::domain_error("Unable to connect to server. Make sure you have a valid connection.");
}
}
}
同步代码瞬间连接,异步代码永远连接不上。我做错了什么?
感谢您的努力。
您应该 run
在某处工作,使用 io_service::run
函数,或 io_service::poll
。顺便说一句,如果你想 resolve
超时,你应该使用 deadline_timer
和 async_wait
.
在 Boost.Asio 中发出异步操作意味着您安排它在 io_service
内调用;除非您告诉 io_service
它应该开始轮询网络、执行预定操作并调用您的回调,否则所有这些操作都不会发生。这就是 io_service::poll
和 io_service::run
等方法所做的。
最简单的方法是在调用 async_resolve
之后调用 io_service::run
:
...
resolver->async_resolve(*query,queryLambda);
io_service->run();
基于this示例,我的程序有这个同步初始化部分:
io_service = new boost::asio::io_service;
resolver = new boost::asio::ip::tcp::resolver(*io_service);
query = new boost::asio::ip::tcp::resolver::query(data.serverAddress.c_str(),data.serverPort.c_str());
iterator = resolver->resolve(*query);
//...
现在这可以正常工作,没有任何问题,除了如果没有连接,调用 resolver->resolve(*query);
会无限阻塞。为了解决这个问题,我决定改用 resolver->async_resolve(*query);
。所以我写了下面的代码来与lambda函数同步,所以下面的代码替换了之前代码的最后一句:
boost::system::error_code queryError;
boost::function<void(const boost::system::error_code&,const boost::asio::ip::tcp::resolver::iterator&)> queryLambda =
[&querySuccess,&queryError,this]
(const boost::system::error_code& errorCode, const boost::asio::ip::tcp::resolver::iterator& it)
{std::cout<<"Success!"<<std::endl;querySuccess=1;iterator=it;queryError=errorCode;};
resolver->async_resolve(*query,queryLambda);
int timeout = 10000;
int totalTime = 0;
int timeWaitStep = 1000;
while(true)
{
std::cout<<"Trying to connect..."<<std::endl;
sleep(timeWaitStep);
if(querySuccess)
{
break;
}
else
{
totalTime += timeWaitStep;
std::cout<<totalTime<<std::endl;
if(totalTime > timeout)
{
throw std::domain_error("Unable to connect to server. Make sure you have a valid connection.");
}
}
}
同步代码瞬间连接,异步代码永远连接不上。我做错了什么?
感谢您的努力。
您应该 run
在某处工作,使用 io_service::run
函数,或 io_service::poll
。顺便说一句,如果你想 resolve
超时,你应该使用 deadline_timer
和 async_wait
.
在 Boost.Asio 中发出异步操作意味着您安排它在 io_service
内调用;除非您告诉 io_service
它应该开始轮询网络、执行预定操作并调用您的回调,否则所有这些操作都不会发生。这就是 io_service::poll
和 io_service::run
等方法所做的。
最简单的方法是在调用 async_resolve
之后调用 io_service::run
:
...
resolver->async_resolve(*query,queryLambda);
io_service->run();