2011-01-06 18 views
1

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()である(あまりにも巧妙な?)を接続マネージャはしていないにもかかわらず、サーバコードによって確立された生きているインフラを維持しますスコープ、通常の手段で。技術的な詳細については、受け入れられた答えのコメントを参照してください。

+2

クラス/バッファオブジェクトが有効範囲外になっていますか? – villintehaspam

+0

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

+0

@villintehaspamから直接コピーされます。 tcp_connectionにデステートされたデストラクタ。それは呼ばれている!私はあなたが私を正しい軌道に乗せたと思う。 – ravenspoint

答えて

2

あなたのtcp_connectionクラスまたはバッファオブジェクトは、非同期操作が完了する前に範囲外になる可能性があります。

あなたのプログラムは、あなたにもいくつかのデータを読み込み、例の別をチェックアウトしていない理由は、チュートリアルの例のいずれか、に基づいているので:http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cpp

クラスがスコープの外に出る理由はあなたということですもはやshared_from_this()を使用していません。これは、バインドハンドラによって格納されたクラスへのshared_ptrを作成することです。これは、あなたのハンドラが呼び出されるまでshared_ptrがあなたのクラスを生かしておくことを意味します。

これは、enable_shared_from_thisから継承する必要がある理由です。

範囲外になる最後のshared_ptrがクラスインスタンスを削除します。

+0

私はこの回答に同意します。サーバーからグローバル名前空間に接続を移動すると、すべてが機能し始めました。醜いですが、保守可能です。 – ravenspoint

+0

よく見ると、自分のコードがtutdaytime3とasync_tcp_echo_serverの組み合わせであることがわかります – ravenspoint

+0

例外はすぐにキャッチされることがあります。コールスタックからはどこにも移動しません。 – ravenspoint

関連する問題