obtener un error de "Servicio no encontrado" en un controlador async_resolve

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo un código que se parece a lo siguiente:

//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));
  }
}

Cuando ejecuto este código, con la puerta y el puerto adecuados del servidor que sé que está funcionando, obtengo el siguiente texto en mi archivo de registro: Error: Servicio no encontrado

¿Alguien puede proporcionar una idea de lo que realmente significa este error?

¿Fue útil?

Solución

En Boost parece que ese error solo puede ocurrir como resultado de una llamada a getaddrinfo (). En MSDN (por su valor), suena como que el nombre del servicio (o puerto) no es compatible con los tipos de socket que admite la persona que llama (¿ASIO?).

En otras palabras, parece como si estuvieras intentando una conexión TCP en un socket que no sea TCP (no es probable, ya que estás usando clases TCP para tu resolución de DNS) o en una puerto no TCP (no estoy seguro de qué hacer al respecto).

Recomiendo entrar en el código usando un depurador para ver qué está mal, aunque será mucho más fácil si usa una llamada síncrona para resolver (). De lo contrario, tendrá que establecer varios puntos de interrupción en los diversos controladores internos que utiliza ASIO (no está tan mal, pero sigue siendo una molestia). Espero que ayude ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top