C++ 关于创建boost.asio异步\u xxxx处理程序对象

C++ 关于创建boost.asio异步\u xxxx处理程序对象,c++,c++11,boost,C++,C++11,Boost,我正在阅读Boost.Asio的源代码,但有一些代码我感到困惑。有没有人帮我解释以便更好地理解,或者我可以参考一些材料来理解?谢谢 实际代码: // Wait until data can be received without blocking. template <typename Handler> void async_receive_from(implementation_type& impl, const null_buffers&, e

我正在阅读Boost.Asio的源代码,但有一些代码我感到困惑。有没有人帮我解释以便更好地理解,或者我可以参考一些材料来理解?谢谢

实际代码:

// 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;
  }
//等待,直到可以无阻塞地接收数据。
模板
void async_receive_from(实现类型&impl),
常量null缓冲区和端点类型以及发送方端点,
套接字\基::消息\标志、处理程序和处理程序)
{
布尔是你的延续=
boost\u asio\u handler\u cont\u helpers::is\u continuation(handler);
//分配并构造一个操作来包装处理程序。
typedef反应性\空\缓冲区\操作;
typename op::ptr p={boost::asio::detail::addressof(处理程序),
boost\u asio\u handler\u alloc\u helpers::allocate(
sizeof(op),handler),0};
p、 p=新(p.v)op(处理程序);
BOOST_ASIO_HANDLER_创建((p.p,“套接字”,
&impl,“异步接收来自(空缓冲区)”;
//重置端点,因为此时无法为其指定任何合理值。
发送方\端点=端点\类型();
启动操作(impl,
(标志和插座底部::带外消息)
?反应器::除_op:反应器::读_op,
p、 p,是_延续,假,假);
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);
typedef被动\u空\u缓冲区\u op;
typename op::ptr p={boost::asio::detail::addressof(处理程序),
boost\u asio\u handler\u alloc\u helpers::allocate(
sizeof(op),handler),0};
p、 p=新(p.v)op(处理程序);

谢谢。

嗯..让我们看看..您正在试图理解
反应式套接字服务
类的
异步接收功能。特别是采用
null\u缓冲区的缓冲区

函数的签名:

template <typename Handler>
  void async_receive_from(implementation_type& impl,
                          const null_buffers&, 
                          endpoint_type& sender_endpoint,
                          socket_base::message_flags flags, 
                          Handler& handler)
我们正在通过
placement new
(第2行)在分配的空间上创建一个
被动\u null\u buffers\u op
实例

现在怎么办


一个ASIO存储了用户传递的处理程序对象,它需要在套接字上启动主读取操作。为此,它调用
start\u op
函数。
start\u op
的详细信息超出了问题的当前范围。因此,简而言之,
start\u op
最终将套接字注册到轮询器,比如说
epoll
。我们的处理程序,现在在
op
中,当读取操作准备好执行时,就会被调用(为此跳过了很多细节)。

你能说得更具体一点吗?你不明白哪一位?你需要一个好的IDE。我想这里需要一个更正:“简言之,start\u op最终会将套接字注册到轮询器”,现在,当你调用async时,调用它的IO对象(基本上是描述符)必须已经注册,如果没有注册,它将在开始任何操作之前注册,因此开始操作基本上注册处理程序;不是套接字(或推送处理程序)到与IO对象的描述符数据关联的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);