ネットワーク接続を表すためにラッパー クラスを使用しています。私の実装にはasync_connect()
、ホスト/サービスを解決し、関連するエンドポイント (可能な場合) に接続する というメソッドが含まれています。このようなもの:
void tcp::connection::async_connect(std::string const& host, std::string const& service,
protocol_type tcp = protocol_type::v4())
{
std::cout << "thread [" << boost::this_thread::get_id() << "] tcp::connection::async_connect()" << std::endl;
resolver(m_io_service).async_resolve(resolver::query(tcp, host, service),
boost::bind(&connection::resolve_handler, this, _1, _2));
}
私が知りたいのは、async_resolve
メソッドの完了によって呼び出されるハンドラーからの接続を確立することです。
メインスレッドとワーカースレッドのどちらを使用してハンドラーを呼び出すかはわかりません。したがって、呼び出す必要がありますsocket::connect()
(そのコードがワーカー スレッドから実行される場合、これが最も賢明な方法です) か、非同期操作を再度開始する必要があります ( socket::async_connect()
- これは、メイン スレッドによって実行されるときに使用する必要があります)。
void tcp::connection::resolve_handler(boost::system::error_code const& resolve_error,
tcp::resolver::iterator endpoint_iterator)
{
std::cout << "thread [" << boost::this_thread::get_id() << "] tcp::connection::resolve_handler()" << std::endl;
if (!resolve_error)
{
boost::system::error_code ec;
m_socket.connect(*endpoint_iterator, ec);
}
}
コンソール出力resolve_handler
から、 my がワーカー スレッドから呼び出されていることを確認しました。では、こちらに電話してもよろしいsocket::connect()
でしょうか?