2016-09-27 10 views
1

私はBoost.Asioのソースコードを読んでいますが、混乱しているコードがあります。理解を深めるために誰かが説明するのに役立ちますか、または私が理解のために参照できる資料はありますか?ありがとう。作成についてboost.asio async_xxxxハンドラオブジェクト

実際のコード:

// Wait until data can be received without blocking. 
    template <typename Handler> 
    void async_receive_from(implementation_type& impl, 
     const null_buffers&, endpoint_type& sender_endpoint, 
     socket_base::message_flags flags, Handler& handler) 
    { 
    bool is_continuation = 
     boost_asio_handler_cont_helpers::is_continuation(handler); 

    // Allocate and construct an operation to wrap the handler. 
    typedef reactive_null_buffers_op<Handler> op; 
    typename op::ptr p = { boost::asio::detail::addressof(handler), 
     boost_asio_handler_alloc_helpers::allocate(
     sizeof(op), handler), 0 }; 
    p.p = new (p.v) op(handler); 

    BOOST_ASIO_HANDLER_CREATION((p.p, "socket", 
      &impl, "async_receive_from(null_buffers)")); 

    // Reset endpoint since it can be given no sensible value at this time. 
    sender_endpoint = endpoint_type(); 

    start_op(impl, 
     (flags & socket_base::message_out_of_band) 
      ? reactor::except_op : reactor::read_op, 
     p.p, is_continuation, false, false); 
    p.v = p.p = 0; 
    } 

特に用:

typedef reactive_null_buffers_op<Handler> op; 
typename op::ptr p = { boost::asio::detail::addressof(handler), 
    boost_asio_handler_alloc_helpers::allocate(
    sizeof(op), handler), 0 }; 
p.p = new (p.v) op(handler); 

感謝。

+0

より具体的に言えますか?どのビットが分かりませんか? –

答えて

0

ええと......あなたはasync_receive_fromreactive_socket_serviceクラスを理解しようとしています。具体的にはnull_bufferが必要です。

関数のシグネチャ:今

template <typename Handler> 
    void async_receive_from(implementation_type& impl, 
          const null_buffers&, 
          endpoint_type& sender_endpoint, 
          socket_base::message_flags flags, 
          Handler& handler) 

null_buffersの重要性は何ですか?

簡潔に言えば、基本的には、他のオーバーロードのようにasync_receive_fromを呼び出している間にバッファを提供するのではなく、呼び出されたコールバックでバッファ管理を行うことができます。
そのユースケースの詳細については、THIS答えを参照してください。

reactive_null_buffers_op<Handler> opとは何ですか?

この時点では、私はあなたがoperationクラスのasioを認識していると仮定しています。簡単に言えば、基本的には、特定の操作が完全に実行されたときにユーザーが提供するコールバックを呼び出します。 scheduler_operation.hppscheduler_operation::completeを探します。

reactive_null_buffers_opは、scheduler_operationreactive_op経由)から派生し、async_receive_fromに渡されたハンドラのコピーを格納します。実際の詳細はちょっと複雑で丈夫です。今のところ、このクラスのdo_completeメソッドがハンドラへのアップコールとは何かを知ることで十分かもしれません。

typename op::ptrとは何ですか?

ASIO_DEFINE_HANDLER_PTRhandler_alloc_helpers.hppに探します。簡単に言えば、async関数に渡されたハンドラを保持するstructです。 ASIOは、ハンドラをヒープ(またはカスタム・アロケータ)に別々に配置して、ソケット受信操作の完了の間存在することを確認する必要があります。我々はplacement new(2行目)を介して割り当てられたスペースにreactive_null_buffers_op<Handler>のインスタンスを作成する

typename op::ptr p = { boost::asio::detail::addressof(handler), 
     boost_asio_handler_alloc_helpers::allocate(
     sizeof(op), handler), 0 }; 
    p.p = new (p.v) op(handler); 

:これは、2行の下に何があります。

今何ですか?

ASIOには、ユーザーが渡したハンドラオブジェクトが格納されています。ソケットでのメイン読み取り操作を開始する必要があります。そのために、それはstart_op関数を呼び出します。 start_opの詳細は、現在の質問の対象外です。したがって、簡潔にstart_opは、ポーラーへのソケットの登録を終了します。例えば、epollです。 opにあるハンドラは、読み込み操作が実行できる状態になったときに呼び出されて終了します(詳細はたくさんありません)。

関連する問題