Async使用Boost.Asio解析

时间:2011-01-13 10:15:13

标签: c++ boost asynchronous boost-asio resolve

我正在尝试异步使用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$

编译时没有错误或警告。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

您需要致电io_service.run()来实际开展工作。将async_resolve视为请求队列中的请求 - 您需要一些东西(io_service)来处理队列中的请求,为此,您实际需要run()它!在这种情况下,它将看到一个请求,执行它,调用处理程序然后退出。

答案 1 :(得分:2)

您的io_serviceip::tcp::resolver对象超出了范围。将它们都移动到FtpSession类的成员中,然后在io_service::run之后调用main中的session.Connect(host)以启动事件循环。

我几天前回答similar question也可能对你有帮助。