Compartilhar via


GetAddrInfo falha com o erro 11001 quando houve uma chamada anterior para a família AF_INET6 no Windows

Este artigo aborda um problema no qual você recebe um erro WSAHOST_NOT_FOUND quando o GetAddrInfo é chamado após outra chamada para a família AF_INET6.

Aplicável ao: Windows 10 - todas as edições
Número original do KB: 4057932

Sintomas

Considere o cenário a seguir.

  • Você usa um nome simples sem sufixos para executar uma consulta a um nome de host.
  • Você tem uma lista de pesquisa de sufixos, e esse nome de host pode ser resolvido por meio de um desses sufixos diferentes do último sufixo da lista.
  • Você executa GetAddrInfo primeiro para a família AF_INET6 e, em seguida, executa esse comando para a família AF_INET.

Nesse cenário, a função não pode resolver o nome do host fornecido e você recebe a mensagem de erro " WSAHOST_NOT_FOUND (11001)".

Por exemplo, você tem o seguinte ambiente:

  • Lista de pesquisa de sufixos: contoso.com, foo.contoso.com, bar.contoso.com
  • Nome do host tentando ser resolvido: teste
  • DNS do host Um registro presente em: foo.contoso.com

Quando você tenta executar o código de exemplo a seguir, as chamadas falham com o erro 11001.

hints.ai_socktype = SOCK_STREAM;
                hints.ai_protocol = IPPROTO_TCP;
                hints.ai_flags = 0;
                hints.ai_family = AF_INET6;
getaddrinfo("test", NULL, &hints, &res)
hints.ai_family = AF_INET;
getaddrinfo("test", NULL, &hints, &res)

Solução alternativa

Esse problema pode ser evitado usando os métodos a seguir. O problema não ocorrerá se você:

  • Use AF_UNSPEC para a família e deixe nosso código determinar os resultados A/AAAA para você.
  • Coloque o sufixo com o registro A do host correspondente como a última entrada na lista de pesquisa de sufixos.
  • Desative o cache negativo no cliente DNS.
  • Passe o nome de host totalmente qualificado a ser resolvido.

A primeira opção é o método recomendado, pois geralmente não há necessidade de fazer as chamadas por família, e o Windows é muito melhor otimizado para retornar o melhor conjunto possível de resultados para ambas as famílias.