получена ошибка & # 8220; Служба не найдена & # 8221; в обработчике async_resolve
-
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 (не так уж плохо, но все же неприятно). Надеюсь, это поможет ...