【问题标题】:Async Resolve with Boost.Asio使用 Boost.Asio 进行异步解析
【发布时间】:2011-06-08 09:53:33
【问题描述】:

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

编译时没有错误或警告。

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    您需要致电io_service.run() 才能真正完成我认为的工作。将async_resolve 视为请求队列中的请求——您需要一些东西(io_service)来处理队列中的请求,而要做到这一点,您实际上需要run() 它!在这种情况下,它会看到一个请求,执行它,调用处理程序然后退出。

    【讨论】:

    • 谢谢! io_service.run() 是否在当前线程上执行此操作?如果是,有什么办法可以做到这一点?
    • 是的,您需要创建一个boost::thread,然后将bind 创建到io_service 实例的run
    【解决方案2】:

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

    我几天前回复了similar question,这也可能对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多