0

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$

ただし、コンパイル時にエラーや警告はありません。

どうすればこれを修正できますか?

4

2 に答える 2

6

io_service.run()あなたは実際に仕事をするために電話する必要があります。をリクエストキュー内のリクエストと考えてください。キュー内のリクエストを処理するにasync_resolveは何か(io_service)が必要です。そのためには、実際にそれを行う必要がありますrun()。この場合、1つの要求を確認して実行し、ハンドラーを呼び出してから終了します。

于 2011-01-13T10:16:32.100 に答える
2

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

私は数日前にあなたにも役立つかもしれない同様の質問に答えました。

于 2011-01-13T13:08:58.067 に答える