2011-01-08 32 views
4

boost::asioを使用するSocketクラスを構築中です。まず、connectメソッドを作成してホストとポートを取得し、それをIPアドレスに解決しました。これはうまくいきましたので、私はasync_resolveに目を向けることにしました。しかし、私のコールバックは常にエラーコード995を取得します(同期先と同じ宛先ホスト/ポートを使用します)。boost :: asio :: async_resolve問題

コード:解像度を開始

機能:この関数を呼び出す

// resolve a host asynchronously 
    template<typename ResolveHandler> 
    void resolveHost(const String& _host, Port _port, ResolveHandler _handler) const 
    { 
    boost::asio::ip::tcp::endpoint ret; 
    boost::asio::ip::tcp::resolver::query query(_host, boost::lexical_cast<std::string>(_port)); 
    boost::asio::ip::tcp::resolver r(m_IOService); 
    r.async_resolve(query, _handler); 
    }; // eo resolveHost 

コード:

void Socket::connect(const String& _host, Port _port) 
    { 
    // Anon function for resolution of the host-name and asynchronous calling of the above 
    auto anonResolve = [this](const boost::system::error_code& _errorCode, 
      boost::asio::ip::tcp::resolver_iterator _epIt) 
    { 
    // raise event 
    onResolve.raise(SocketResolveEventArgs(*this, !_errorCode ? (*_epIt).host_name() : String(""), _errorCode)); 

    // perform connect, calling back to anonymous function 
    if(!_errorCode) 
    connect(*_epIt); 
    }; 

    // Resolve the host calling back to anonymous function 
    Root::instance().resolveHost(_host, _port, anonResolve); 

    }; // eo connect 

error_codemessage()機能は次のとおりです。

事前に

int _tmain(int argc, _TCHAR* argv[]) 
{ 
morse::Root root; 
TextSocket s; 
s.connect("somehost.com", 1234); 
while(true) 
{ 
    root.performIO(); // calls io_service::run_one() 
} 
return 0; 
} 

ありがとう:

そして、私のmain.cppは、このようになります!

答えて

9

resolverオブジェクトが範囲外になった場合は、Socketクラスのメンバに移動し、resolveHostを空き関数ではなくメソッドにします。

boost::asio::ip::tcp::resolvera typedef ofであり、basic_resolver,which inheritsからbasic_io_objectであるためです。レゾルバが有効範囲外になると、handler can be postedの前にリゾルバサービス~basic_io_object()destroysが存在します。

にかかわらず、非同期 操作はすぐにか ない完了したかどうかの、ハンドラはこの関数内から 呼び出されることはありません。ハンドラの呼び出し は、 boost :: asio :: io_service :: post()を使用するのと同等の方法で の方法で実行されます。

+0

大変ありがとうございました。それは完全にはっきりしていたはずです。 –

+2

@ Moo-Juice問題はありません。時には目の2番目のセットが必要です。 –

関連する問題