получена ошибка & # 8220; Служба не найдена & # 8221; в обработчике async_resolve

StackOverflow https://stackoverflow.com/questions/1400787

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть код, который выглядит следующим образом:

//unrelated code snipped
resolver.reset(new tcp::resolver(iosvc));
tcp::resolver::query query(host, port);
resolver->async_resolve(query,
    boost::bind(&TCPTransport::handle_resolve, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::iterator));

LOG4CXX_INFO(logger, "Attempting connection to at " << host << ":" << port);
//unrelated code snipped



void TCPTransport::handle_resolve(const boost::system::error_code& err,
  tcp::resolver::iterator endpoint_iterator)
{
  if (err)
  {
    LOG4CXX_ERROR(logger, "Error: " << err.message());
  }
  else
  {
    tcp::endpoint endpoint = *endpoint_iterator;
    if (!socket)
    {
      socket.reset(new tcp::socket(iosvc));
    }
    socket->async_connect(endpoint,
      boost::bind(&TCPTransport::handle_connect, this,
        boost::asio::placeholders::error, ++endpoint_iterator));
  }
}

Когда я запускаю этот код с соответствующими воротами и портом сервера, который, как я знаю, запущен, я получаю следующий текст в моем файле журнала: Ошибка: служба не найдена

Кто-нибудь может дать некоторое представление о том, что на самом деле означает эта ошибка?

Это было полезно?

Решение

В Boost похоже, что эта ошибка может произойти только в результате вызова getaddrinfo (). в MSDN (для чего это стоит), Похоже, имя службы (или порт) не поддерживается для типов сокетов, которые поддерживает вызывающая сторона (ASIO?).

Другими словами, кажется , что вы пытаетесь установить соединение TCP через сокет не-TCP (маловероятно, так как вы используете классы TCP для разрешения DNS) или не TCP-порт (не уверен, что с этим делать).

Я рекомендую войти в код с помощью отладчика, чтобы увидеть, что происходит не так, хотя это будет намного проще, если вы используете синхронный вызов для разрешения (). В противном случае вам придется установить несколько точек останова на различные внутренние обработчики, которые использует ASIO (не так уж плохо, но все же неприятно). Надеюсь, это поможет ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top