2

私は後押しするのはかなり新しいです。クロスプラットフォームの低レベル C++ ネットワーク API が必要だったので、asio を選択しました。これで、ソケットへの接続と書き込みに成功しましたが、非同期の読み取り/書き込みを使用しているため、要求を追跡する方法が必要です (必要に応じて、何らかの ID を取得する必要があります)。ドキュメント/リファレンスを調べましたが、ユーザー データをハンドラーに渡す方法が見つかりませんでした。考えられる唯一のオプションは、コールバックとして機能し、ID を追跡する特別なクラスを作成して渡すことです。コールバックとしてソケットに。より良い方法はありますか?それともそれを行うための最良の方法ですか?

4

1 に答える 1

3

async_xxx関数は、完了ハンドラーのタイプに基づいてテンプレート化されています。ハンドラーは単純な「コールバック」である必要はなく、適切なoperator()署名を公開するものであれば何でもかまいません。

したがって、次のようなことができるはずです。

// Warning: Not tested
struct MyReadHandler
{
    MyReadHandler(Whatever ContextInformation) : m_Context(ContextInformation){}

    void 
    operator()(const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        // Use m_Context
        // ...            
    }

    Whatever m_Context;
};

boost::asio::async_read(socket, buffer, MyReadHander(the_context));

または、 asioチュートリアルで説明されているように、ハンドラーをプレーン関数として使用し、呼び出しサイトでバインドすることもできます。上記の例は次のようになります。

void 
HandleRead(
    const boost::system::error_code& error, 
    std::size_t bytes_transferred
    Whatever context
)
{
    //...
} 

boost::asio::async_read(socket, buffer, boost::bind(&HandleRead,
   boost::asio::placeholders::error_code,
   boost::asio::placeholders::bytes_transferred,
   the_context
));
于 2010-01-22T16:42:17.260 に答える