2011-01-13 11 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()が必要です。この場合、1つの要求が表示され、実行され、ハンドラを呼び出して終了します。

+0

ありがとうございます! 'io_service.run()'は現在のスレッドでこれを実行しますか?はいの場合、この非ブロック化を行う方法はありますか? –

+1

はい、あなたは 'boost :: thread'を作成し、' io_service'インスタンスの 'run'に' bind'する必要があります。 – Nim

2

io_serviceip::tcp::resolverオブジェクトが範囲外になります。両方をFtpSessionクラスのメンバーに移動し、session.Connect(host)の後にio_service::runをmainの内側に呼び出して、イベントループを開始します。

私は数日前にsimilar questionと回答していますが、これもあなたを助けるかもしれません。

関連する問題