2

Boost.Asio toturialに従って単純なTCPクライアントを実装しましたが、最初のステップでブロックされ、boost::asio::ip::tcp::resolver::async_resolve機能せず、ResolverHandlerが呼び出されることはありません。

    void client::start()
    {
        socket_.reset(new boost::asio::ip::tcp::socket(io_service_));
        // Start an asynchronous resolve to translate the server and service names
        // into a list of endpoints.
        tcp::resolver::query query(server_address_, server_port_);
        resolver_.async_resolve(query,
            boost::bind(&client::handle_resolve, 
            shared_from_this(),
            boost::asio::placeholders::error,
            boost::asio::placeholders::iterator));
    }

上記のソースコードのように、、、、、およびリゾルバーオブジェクトを作成してio_serviceからメソッドを呼び出しますが、ResolverHandlerが呼び出されることはほとんどなく、アプリケーションを初めて起動するときに、ResolverHandlerが1回または2回呼び出されることがあります。 、しかしそれ以上は何もありません。socketresolverqueryresolver_.async_resolve()client::handle_resolve

公式ドキュメントを読みましたが、何も見つかりません。なにか提案を?

4

2 に答える 2

3

完了ハンドラーが呼び出されない場合-おそらくio_service正しく実行されていません:例:そのrunループは、戻らなかった他のハンドラーによってブロックされているか、作業不足などのために終了している可能性があります。

于 2013-02-17T18:49:22.767 に答える
0

これは私のために働きます:

void SSLSocket::Connect(SSLSocket* psSLS, const string& serverPath, const string& port)
{
   boost::shared_ptr<boost::asio::io_service> IOServ(new boost::asio::io_service);
   // Create the resolver and query objects to resolve host name in serverPath to an ip address.
   IOService = IOServ; // IOService defined as a class member in the .h file.
   boost::asio::ip::tcp::resolver resolver(*IOService);
   boost::asio::ip::tcp::resolver::query query(serverPath, port);
   ...
}

上記のコードは同期メソッド.vsを使用しています。コードが使用している非同期メソッド。非同期で続行する場合は、io_serviceオブジェクトとクエリオブジェクトをクラス変数にします。また、async_resolveメソッドは何もせずにすぐに戻ることを理解してください。アドレスは非同期的に解決され、その後、handle_resolveメソッドが呼び出されます。

于 2013-02-16T14:36:19.847 に答える