async_resolve和async_connect参数的生存期

async_resolve and async_connect params lifetime

本文关键字:async 生存期 参数 resolve connect      更新时间:2023-10-16

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

异步解决

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,一般规则是:

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

当规则出现异常时,文档将指示它,例如boost::asio::async_writebuffers参数的情况,在调用处理程序之前,该参数必须保持有效。


对于ip::basic_resolver:

  • 与其他服务对象一样,如果服务对象被未完成的异步操作破坏,那么异步操作处理程序将被boost::asio::error::operation_aborted调用。如果您不想管理服务对象的寿命,请使用shard_ptr对其进行管理,并将shared_ptr的副本绑定到处理程序中
  • 对于async_resolvequery对象通过常量引用传递,并最终复制到底层操作的构造函数(resolve_endpoint_op)中。这也允许使用临时query对象。

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

对于boost::asio::async_connect:

  • 根据文档,begin参数是通过值传递的
  • resolver不需要保持活动状态,因为迭代器具有查询结果的共享所有权。虽然不在文档中,但ip::basic_resolver_iterator维护shared_ptrip::basic_resolver_entry对象的std::vectorbasic_resolver_entry对象具有端点、主机名和服务名的成员变量