C++: boost::asio: async_resolve() 不起作用(使用 lambda 函数),但 resolve() 有效
C++: boost::asio: async_resolve() doesn't work (with lambda functions), but resolve() works
根据这个例子,我的程序中有这样的同步初始化部分:
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
。
Asio发出一个异步操作意味着你把它安排在io_service
内部调用;除非您告诉io_service
它应该开始轮询网络,执行预定的操作并调用回调,否则所有这些操作都不会发生。这就是像io_service::poll
和io_service::run
这样的方法所做的。
最简单的方法是在调用async_resolve
之后调用io_service::run
:
...
resolver->async_resolve(*query,queryLambda);
io_service->run();
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- C++: boost::asio: async_resolve() 不起作用(使用 lambda 函数),但 resolve() 有效