0

http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cppから

typedef boost::shared_ptr<chat_session> chat_session_ptr;



  void start_accept()
      {
        chat_session_ptr new_session(new chat_session(io_service_, room_));
        acceptor_.async_accept(new_session->socket(),
            boost::bind(&chat_server::handle_accept, this, new_session,
              boost::asio::placeholders::error));
      }

void handle_accept(chat_session_ptr session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      session->start();
    }

    start_accept();

new_session共有ptrが破壊されないのはなぜですか? 私が正しく理解していればacceptor_.async_accept、非同期呼び出しとしてすぐに戻りますか? start_accept関数が戻ったときに共有ptrが削除されることはありません。

new_session クラスにはソケットメンバーがあるため、ソケットの有効期間はこの new_session にバインドされているため、tcp メッセージの読み書きも可能ですか? ではない?

----編集--- ビリー・オニールの回答に基づく : さらに質問があります

エラーが発生するか、サーバーを強制的に閉じない限り、new_session は永久に存在しますか?

4

2 に答える 2

0

はい、chat_session「アクティブ」である限り存続します。つまり、エラーは発生しません。そのライフサイクルは 2 つの部分に分けることができます。

1)startメンバー関数が呼び出される前に、インスタンスはの完了ハンドラにバインドさchat_sessionれているため、存続します。完了ハンドラーが呼び出されると、キューから削除され、破棄されます - その. ただし、接続が正常に受け入れられた場合、完了ハンドラーは 2 番目のフェーズを開始します。shared_ptr<chat_session>acceptor_io_serviceshared_ptr<chat_session>

2)chat_session::start呼び出されると、chat_session自身をchat_roomマネージャーに登録する

room_.join(shared_from_this());

shared_ptr<chat_session>あるコンテナにa を格納します。これshared_ptrは のコンテナから削除され、chat_session::startエラー時に呼び出されます。

(実際には、この登録がなくても、すべての async. 操作で使用されるイディオムchat_sessionにより、存続します。)shared_from_this

于 2013-05-27T12:25:43.240 に答える
0

boost::bindは、参照された のコピーを含む関数オブジェクトを返します。shared_ptrこの場合はnew_sessionです。async_accept非同期の場合もありますが、非同期リクエストが完了したときに関数を呼び出せるように、ターゲット関数オブジェクトのコピーを保存する必要があります。

于 2013-05-27T07:04:54.140 に答える