2011-01-13 57 views
0

我試圖異步使用Boost.Asio解析ftp主機。異步解決與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()`在當前線程上執行此操作嗎?如果是的話,有沒有辦法做到這一點非阻塞? – 2011-01-13 10:20:08

2

您的io_serviceip::tcp::resolver對象超出範圍。將它們都移到FtpSession類的成員中,然後在session.Connect(host)之後調用io_service::run以啓動事件循環。

我幾天前回答了similar question,這可能對你有幫助。