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