async_resolve和async_connect参数生命周期

时间:2012-10-09 12:09:56

标签: c++ boost-asio

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

async_resolve

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是否按值返回处理程序? (是)

async_connect

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

(4)begin是否按值传递? (是)
(5)我需要保持resolver活着吗? (无)

1 个答案:

答案 0 :(得分:3)

使用Boost.Asio,一般规则是:

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

当规则有例外时,文档会指出它,例如boost::asio::async_write buffers 参数的情况,在调用处理程序之前必须保持有效。< / p>


ip::basic_resolver

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

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

boost::asio::async_connect

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