boost :: asio :: async_resolve Проблема - PullRequest
4 голосов
/ 09 января 2011

Я нахожусь в процессе создания класса Socket, который использует boost::asio.Для начала я создал метод 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() error_code:

The I/O operation has been aborted because of either a thread exit or an application request

Имой main.cpp выглядит так:

int _tmain(int argc, _TCHAR* argv[])
{
 morse::Root root;
 TextSocket s;
 s.connect("somehost.com", 1234);
 while(true)
 {
  root.performIO(); // calls io_service::run_one()
 }
 return 0;
}

Заранее спасибо!

1 Ответ

9 голосов
/ 09 января 2011

Ваш resolver объект выходит из области видимости, переместите его в член класса Socket и сделайте resolveHost методом, а не свободной функцией.

Это происходит потому, что boost::asio::ip::tcp::resolver typedef из a basic_resolver, , который наследует от basic_io_object.Когда распознаватель выходит из области видимости, ~basic_io_object() уничтожает базовую службу распознавателя до того, как ваш обработчик может быть отправлен .

Независимо от того, выполняется ли асинхронная операциязавершается немедленно или нет, обработчик не будет вызываться изнутри этой функции.Вызов обработчика будет выполнен способом, эквивалентным использованию boost :: asio :: io_service :: post ().

...