Condividi tramite


GetAddrInfo ha esito negativo e viene visualizzato l'errore 11001 quando è stata eseguita una chiamata precedente per la famiglia di AF_INET6 in Windows

Questo articolo risolve un problema in cui viene visualizzato un errore di WSAHOST_NOT_FOUND quando GetAddrInfo viene chiamato dopo un'altra chiamata per la famiglia di AF_INET6.

Si applica a: Windows 10 - tutte le edizioni
Numero KB originale: 4057932

Sintomi

Prendi in considerazione lo scenario seguente:

  • Usare un nome flat senza suffissi per eseguire una query per un nome host.
  • Si dispone di un elenco di ricerca suffisso e questo nome host è risolvibile tramite uno di questi suffissi diversi dall'ultimo suffisso nell'elenco.
  • Si esegue GetAddrInfo prima di tutto per la famiglia di AF_INET6 e quindi si esegue tale comando per la famiglia di AF_INET.

In questo scenario, la funzione non riesce a risolvere il nome host fornito e viene visualizzato il messaggio di errore " WSAHOST_NOT_FOUND (11001)".

Ad esempio, si dispone dell'ambiente seguente:

  • Elenco di ricerca suffisso: contoso.com, foo.contoso.com, bar.contoso.com
  • Nome host che prova a essere risolto: test
  • Host DNS Record A presente in: foo.contoso.com

Quando si tenta di eseguire il codice di esempio seguente, le chiamate hanno esito negativo con l'errore 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)

Soluzione alternativa

Questo problema può essere evitato usando i metodi seguenti. Il problema non si verifica se:

  • Usare AF_UNSPEC per la famiglia e consentire al codice di determinare automaticamente i risultati A/AAAA.
  • Inserire il suffisso con l'host corrispondente Record A come ultima voce nell'elenco di ricerca del suffisso.
  • Disabilitare la memorizzazione nella cache negativa nel client DNS.
  • Passare il nome host completo da risolvere.

La prima opzione è il metodo consigliato, in quanto di solito non è necessario eseguire le chiamate per ogni famiglia, e Windows è molto meglio ottimizzato per restituire il miglior set di risultati possibile per entrambe le famiglie.