繁体   English   中英

使用Boost.Asio进行异步解析

[英]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_serviceip::tcp::resolver对象超出范围。 将它们都移到FtpSession类的成员中,然后在session.Connect(host)之后在main内部调用io_service::run以启动事件循环。

几天前,我回答了一个类似的问题 ,可能也会对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM