recebendo um erro de “Serviço não encontrado” em um manipulador async_resolve

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho o código que se parece com o seguinte:

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

Quando eu executar esse código, com o portão apropriado e porta do servidor que sei é se uma corrida, eu recebo o seguinte texto no meu arquivo de log: Erro: Serviço não encontrado

Alguém pode fornecer algumas dicas sobre o que este erro significa realmente?

Foi útil?

Solução

Em impulso parece que esse erro só pode acontecer como resultado de uma chamada para getaddrinfo (). Em MSDN (para o que vale a pena), parece que o nome do serviço (ou porto) não é compatível com os tipos de socket que o chamador (? ASIO) apoios.

Em outras palavras, ele parece como você está tentando uma conexão TCP em cada um socket não-TCP (não provável, desde que você está usando classes TCP para a resolução DNS) ou para um porta não-TCP (não sei o que fazer sobre isso).

Eu recomendo entrar no código usando um depurador para ver o que está acontecendo de errado, no entanto, que vai ser muito mais fácil se você usar uma chamada síncrona para resolver (). Caso contrário, você terá que definir vários pontos de interrupção nos vários manipuladores internos que use ASIO (não é tão ruim, mas ainda um incômodo). Espero que ajude ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top