boost :: asio :: async_resolve问题

时间:2011-01-08 22:49:54

标签: sockets asynchronous c++11 boost-asio

我正在构建一个使用boost::asio的Socket类。首先,我创建了一个connect方法,它接受了主机和端口并将其解析为IP地址。这很好用,所以我决定查看async_resolve。但是,我的回调总是得到错误代码995(使用与它同步工作时相同的目标主机/端口)。

启动分辨率的功能:

  // resolve a host asynchronously
  template<typename ResolveHandler>
  void resolveHost(const String& _host, Port _port, ResolveHandler _handler) const
  {
   boost::asio::ip::tcp::endpoint ret;
   boost::asio::ip::tcp::resolver::query query(_host, boost::lexical_cast<std::string>(_port));
   boost::asio::ip::tcp::resolver r(m_IOService);
   r.async_resolve(query, _handler);
  }; // eo resolveHost

调用此函数的代码:

  void Socket::connect(const String& _host, Port _port)
  {
   // Anon function for resolution of the host-name and asynchronous calling of the above
   auto anonResolve = [this](const boost::system::error_code& _errorCode, 
           boost::asio::ip::tcp::resolver_iterator _epIt)
   {
    // raise event
    onResolve.raise(SocketResolveEventArgs(*this, !_errorCode ? (*_epIt).host_name() : String(""), _errorCode));

    // perform connect, calling back to anonymous function
    if(!_errorCode)
     connect(*_epIt);
   };

   // Resolve the host calling back to anonymous function
   Root::instance().resolveHost(_host, _port, anonResolve);

  }; // eo connect

message()的{​​{1}}功能是:

error_code

我的The I/O operation has been aborted because of either a thread exit or an application request 看起来像这样:

main.cpp

提前致谢!

1 个答案:

答案 0 :(得分:9)

您的resolver对象超出范围,将其移至Socket类的成员,并使resolveHost成为方法而不是自由函数。

这是因为boost::asio::ip::tcp::resolver来自basic_resolver basic_io_object ~basic_io_object()a typedef of来自{{1}}。当解析程序超出范围时,{{1}}之前的{{1}} which inherits基础解析程序服务。

  

无论是否异步   操作立即完成或   不,不会调用处理程序   从这个功能。调用   处理程序的执行将在一个   相当于使用的方式   提高:: ASIO :: io_service对象::柱()。