2011-01-13 4 views
0

Я пытаюсь сделать асинхронно решить ftp-хост, используя Boost.Asio.Async Resolve with Boost.Asio

Вот что я пытался до сих пор:

#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; 
} 

Но по какой-то причине, когда я исполню его, он просто не печатает ничего:

[email protected]:~/Desktop$ g++ -o test -lboost_system test.cc 
[email protected]:~/Desktop$ ./test 
[email protected]:~/Desktop$ 

никаких ошибок или предупреждений в компиляция все же.

Как это исправить?

ответ

5

Вам необходимо позвонить по телефону io_service.run(), чтобы на самом деле выполнить работу. Подумайте о async_resolve как о запросе в очереди запросов - вам нужно что-то (io_service) для обработки запросов в очереди, и для этого вам действительно нужно run()! В этом случае он увидит один запрос, выполнит его, вызовет обработчик и выйдет.

+0

Спасибо! Выполняет ли 'io_service.run()' это в текущем потоке? Если да, есть ли способ сделать это без блокировки? –

+1

Да, это так, вам нужно создать «boost :: thread», а затем «привязать» к 'run' экземпляра' io_service'. – Nim

2

Ваш io_service и ip::tcp::resolver объект выходит за рамки. Переместите оба из них в члены класса FtpSession, затем вызовите io_service::run внутри основного после session.Connect(host), чтобы запустить цикл событий.

Я ответил similar question несколько дней назад, что может вам помочь.