gpt4 book ai didi

c++ - 关于创建 boost.asio async_xxxx 处理程序对象

转载 作者:行者123 更新时间:2023-11-30 05:22:16 24 4
gpt4 key购买 nike

我正在阅读 Boost.Asio 源代码,但有些代码让我感到困惑。有没有人帮忙解释一下以便更好地理解,或者我可以引用一些 Material 来理解?谢谢。

实际代码:

// 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);

谢谢。

最佳答案

嗯..让我们看看..您正在尝试理解函数 async_receive_fromreactive_socket_service类(class)。特别是需要 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::completescheduler_operation.hpp .

reactive_null_buffers_op源自 scheduler_operation (通过 reactive_op )并且它还存储传递给 async_receive_from 的处理程序的拷贝.实际细节有点复杂和实用。现在知道 do_complete 可能就足够了此类的方法是向上调用处理程序的方法。

什么是 typename op::ptr

寻找ASIO_DEFINE_HANDLER_PTRhandler_alloc_helpers.hpp .简而言之,它是一个结构,用于保存传递给异步函数的处理程序。 ASIO 需要在堆上(或通过自定义分配器)单独分配处理程序,以确保它在套接字接收操作完成期间存在。这是下面两行的作用:

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);

我们正在创建 reactive_null_buffers_op<Handler> 的实例通过 placement new 在分配的空间上(第 2 行)。

现在呢?

一个ASIO已经存储了用户传递的handler对象,它需要在socket上开始主要的读操作。为此,它调用 start_op功能。 start_op详情超出了所问问题的当前范围。所以,简而言之 start_op最终将套接字注册到轮询器,比如 epoll .而我们的处理程序,现在在 op最终在读取操作准备好执行时被调用(为此跳过了很多细节)。

关于c++ - 关于创建 boost.asio async_xxxx 处理程序对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com