[英]Async Resolve with Boost.Asio
我正在尝试使用Boost.Asio 异步解析ftp主机。
到目前为止,这是我尝试过的方法:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using boost::asio::ip::tcp;
class FtpSession {
public:
void Connect(std::string& host) {
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(host, "ftp");
resolver.async_resolve(query,
boost::bind(&FtpSession::OnResolve, this,
boost::asio::placeholders::error,
boost::asio::placeholders::iterator));
}
private:
void OnResolve(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) {
if (!err)
{
std::cout << "resolved!";
}
else
{
std::cout << "error.";
}
}
};
int main() {
FtpSession session;
std::string host("ftp.remotesensing.org");
session.Connect(host);
return 0;
}
但是由于某种原因,当我执行它时,它什么也没打印:
alon@alon-GA-73PVM-S2H:~/Desktop$ g++ -o test -lboost_system test.cc
alon@alon-GA-73PVM-S2H:~/Desktop$ ./test
alon@alon-GA-73PVM-S2H:~/Desktop$
编译时没有错误或警告。
我怎样才能解决这个问题?
您需要调用io_service.run()
来实际执行工作方法。 可以将async_resolve
视为请求队列中的一个请求-您需要一些东西( io_service
)来处理队列中的请求,而要做到这一点,您实际上需要对它进行run()
! 在这种情况下,它将看到一个请求,执行该请求,调用该处理程序,然后退出。
您的io_service
和ip::tcp::resolver
对象超出范围。 将它们都移到FtpSession
类的成员中,然后在session.Connect(host)
之后在main内部调用io_service::run
以启动事件循环。
几天前,我回答了一个类似的问题 ,可能也会对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.