Iは、I/O操作がスレッドの終了またはアプリケーションの要求中止されました。このエラーメッセージブースト:: ASIOエラー「I/O操作が中止されました...」
」を受け付けております「
ブースト:: ASIOを使用して::ソケット:: async_read_some()
エラーは何を意味するのでしょうか?私は何を探していますか?ここで
は、関連するコードです:
void tcp_connection::start()
{
printf("Connected to simulator\n");
socket_.async_read_some(boost::asio::buffer(myBuffer,256),
boost::bind(&tcp_connection::read_sim_handler,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void tcp_connection::read_sim_handler(
const boost::system::error_code& error, // Result of operation.
std::size_t len) // Number of bytes read.
{
try {
if (error == boost::asio::error::eof) {
// Connection closed cleanly by peer.
printf("Sim connection closed\n");
return;
} else if (error) {
throw boost::system::system_error(error); // Some other error. if(! error)
}
socket_.async_read_some(boost::asio::buffer(myBuffer,256),
boost::bind(&tcp_connection::read_sim_handler,this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}
私は(async_read_someへの呼び出しを交換するとき)read_someと()start()メソッドでは、すべてがメッセージを待っているサーバブロック以外(正常に動作します! )
コメントに続いて、tcp_connectionが範囲外になっています。私はhttp://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/tutorial/tutdaytime3.html から次のコードをコピーしました。 "tcp_connectionオブジェクトを参照する操作がある限り、tcp_connectionオブジェクトを有効に保ちたいので、shared_ptrとenable_shared_from_thisを使用します。 私はそれが何を意味するのか分かりません。だから私は何とかそれを壊している?さらにコメントに続いて
、答えはこれは巧妙な雇用ではなく
void tcp_connection::start()
{
printf("Connected to simulator\n");
socket_.async_read_some(boost::asio::buffer(myBuffer,256),
boost::bind(&tcp_connection::read_sim_handler,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
渡すshared_from_this()である(あまりにも巧妙な?)を接続マネージャはしていないにもかかわらず、サーバコードによって確立された生きているインフラを維持しますスコープ、通常の手段で。技術的な詳細については、受け入れられた答えのコメントを参照してください。
クラス/バッファオブジェクトが有効範囲外になっていますか? – villintehaspam
myBufferはtcp_connectionのメンバーです。 tcp_connectionクラスはtcp_serverコードで作成され、http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/tutorial/tutdaytime3/src.html – ravenspoint
@villintehaspamから直接コピーされます。 tcp_connectionにデステートされたデストラクタ。それは呼ばれている!私はあなたが私を正しい軌道に乗せたと思う。 – ravenspoint