Pode Dns.GetHostEntry sempre retornar um IPHostEntry com um AddressList vazio?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou apenas querendo saber se pode haver um caso em que o nome do host pode ser resolvido com êxito, mas o hostEntry.AddressList retornado é vazio.

Atualmente eu estou fazendo algo parecido com isto:

IPHostEntry hostEntry = Dns.GetHostEntry("some.hostname.tld");
if (hostEntry.AddressList.Count() < 1)
{
  // can that ever happen?
  throw new ArgumentException("hostName has no assigned IP-Address");
}
TcpClient client = new TcpClient(hostEntry.AddressList[0], 1234);

A minha suposição é que Dns.GetHostEntry quer lança uma exceção se o nome do host não for encontrado ou caso contrário o AddressList é não vazio, mas eu não tenho certeza sobre isso.

Foi útil?

Solução

Não, você não vê uma lista de endereços vazio: mesmo se você consultar um rótulo DNS que existe, mas não tem registros A ou AAAA (IPv6), um SocketException ( "No host é conhecido") será lançada.

Você pode verificar isso olhando para o InternalGetHostByName(string hostName, bool includeIPv6) função em DNS.cs a partir da versão .NET fonte de referência. Com a exceção de algumas precauções específicas da plataforma, pesquisas de DNS são um invólucro simples ao redor do Winsock gethostbyname função.

Gethostbyname será ou falhar ou retornar uma lista de endereços. Uma lista de endereços vazio não é devolvido, porque a função falhará com WSANO_DATA ( "nome válido, nenhum registro de dados do tipo solicitado"), neste caso, o que se traduz com a exceção de soquete já vimos em .NET.

EDIT maio de 2012, solicitado pelo respostas afirmando que uma lista vazia é retornado de qualquer maneira: Note que esta resposta só se aplica a Win32, e que plataformas como WinCE podem se comportar de forma bastante diferente. Se você está vendo 'lista vazia' comportamento em Win32, eo pedido que você está fazendo é contra um servidor DNS publicamente disponível, por favor poste o seu código ...

Outras dicas

Apenas para os registros.

Graças à mdb é aceita Eu levei um olhar para a descrição do erro WSANO_DATA :

O nome solicitado é válido e foi encontrado no banco de dados, mas ele faz não tem os dados corretos associados sendo resolvidos para. O exemplo habitual para isso é uma tentativa de tradução nome do host-to-address (utilizando gethostbyname ou WSAAsyncGetHostByName), que usa o DNS (Domain Name Server). Um registro MX é devolvido mas nenhum A-indicando o registro do host em si existe, mas não é directamente acessível.

Então, isso praticamente responde a minha pergunta:)

Você tem três situações possíveis aqui:

  1. Existe O nome do host (DNS tem um A Record) e resolve um endereço IP

    • condição nunca é atingido
  2. Existe O nome do host (DNS sabe sobre o domínio), porém há registros A existe.

    • Este é um cenário extremamente improvável, e eu acho que isso nunca pode acontecer em primeiro lugar.
  3. O nome do host não existe

    • exceção é lançada, você nunca chegar lá.

Então, não, eu não acho que pode acontecer.

A resposta é YES . O método GetHostEntry consulta um servidor DNS para os endereços IP e aliases associados com um endereço IP.

endereços IPv6 são filtrados a partir dos resultados do método GetHostEntry se o computador local não tem IPv6 instalado. Como resultado, é possível receber de volta uma instância IPHostEntry vazio se apenas resultados IPv6 quando disponível para o parâmetro de endereço.

A propriedade Aliases da instância IPHostEntry retornado é não povoada por este método e estará sempre vazia.

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