gpt4 book ai didi

c++ - async_resolve 和 async_connect 参数生命周期

转载 作者:行者123 更新时间:2023-11-30 02:59:33 24 4
gpt4 key购买 nike

我想知道传递给上述方法的对象的生命周期是多少。

异步解析

ip::basic_resolver::async_resolve(const query & q, ResolveHandler handler);

(1) 在处理程序被调用之前,我是否需要让解析器保持事件状态? (是的)
(2) async_resolve 是否复制query对象? (我正在传递在堆栈上创建的一个 - 是的)

{
boost::asio::ip::tcp::resolver::query query(host_, port_);
resolver_.async_resolve(query, );
}

(3) boost::asio::ip::tcp::resolver::iterator 是否按值返回到处理程序中? (是的)

异步连接

template<..> void async_connect(basic_socket<Protocol, SocketService> & s,
Iterator begin, ComposedConnectHandler h);

(4)begin是传值吗? (是的)
(5) 我需要保持 resolver 存活吗? (没有)

最佳答案

对于 Boost.Asio,一般规则是:

  • 通过 const-reference 或 value 传递的参数被复制。如果支持,它们可能会被移动。
  • 非 const 引用传递的参数必须保持有效,直到同步操作完成或调用异步操作的处理程序。

当规则有异常(exception)时,文档会指出,例如 boost::asio::async_writebuffers 参数。 ,在调用处理程序之前必须保持有效。


对于 ip::basic_resolver :

  • 与其他服务对象一样,如果服务对象因未完成的异步操作而被销毁,则异步操作处理程序将通过 boost::asio::error::operation_aborted 调用。如果您不想管理服务对象的生命周期,请使用 shard_ptr 对其进行管理。并将 shared_ptr 的拷贝绑定(bind)到处理程序中。
  • async_resolve query 对象由 const-reference 传递,并最终复制到基础操作的构造函数 (resolve_endpoint_op) 中。这也允许使用临时 query 对象。

    {
    typedef boost::asio::ip::tcp::resolver::query query;
    resolver_.async_resolve(query(host_, port_), );
    }
  • async_resolve期望 handler 满足 ResolverHandler要求。它记录了迭代器参数是按值获取的。

对于 boost::asio::async_connect :

  • 根据文档,begin 参数是按值传递的。
  • 解析器 不需要保持事件状态,因为迭代器共享查询结果的所有权。虽然不在文档中,但 ip::basic_resolver_iteratorip::basic_resolver_entrystd::vector 维护一个 shared_ptr对象。 basic_resolver_entry 对象具有端点、主机名和服务名称的成员变量。

关于c++ - async_resolve 和 async_connect 参数生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799720/

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