InetAddress.getCanonicalHostName () retorna IP em vez de Hostname

Procurei como fazer a pesquisa de IP em Java no Stack Overflow, mas as respostas correspondem ao que já estou fazendo e não resolvem o meu problema.

Aqui está o meu código:

public void printHostname( String ip ) {
    System.out.println( InetAddresses.forString( ip ).getCanonicalHostName( ) );
}

InetAddresses é apenas uma classe de utilitário da biblioteca da goiaba para obter umaInetAdress.

O problema: esse código funciona conforme o esperado com alguns endereços IP e não com outros.

Um exemplo de trabalho

Por exemplo, para IP 157.55.39.29, a saída é:

msnbot-157-55-39-29.search.msn.com

Este resultado parece correto de acordo com o Linuxhost comando:

> host 157.55.39.29
29.39.55.157.in-addr.arpa domain name pointer msnbot-157-55-39-29.search.msn.com.
Um exemplo que não funciona

Para IP 123.125.71.75, ohost comando retorna:

> host 123.125.71.75
75.71.125.123.in-addr.arpa domain name pointer baiduspider-123-125-71-75.crawl.baidu.com.

Mas a saída do meu código Java é:

123.125.71.75

Considerando que a produção esperada deve ser

baiduspider-123-125-71-75.crawl.baidu.com

O javadoc degetCanonicalHostName O método diz:

Devoluções:
o nome de domínio totalmente qualificado para esse endereço IP ou, se a operação não for permitida pela verificação de segurança, a representação textual do endereço IP.

mas tenho certeza de que não há realmente um problema com uma verificação de segurança ... ou não entendo o que está errado.

Você tem alguma sugestão para explicar esse comportamento? Você tem uma solução alternativa?

EDIT # 1

Ao procurar uma solução, tentei depurar a implementação no JDK:

// first lookup the hostname
host = nameService.getHostByAddr(addr.getAddress());

/* check to see if calling code is allowed to know
 * the hostname for this IP address, ie, connect to the host
 */
if (check) {
    SecurityManager sec = System.getSecurityManager();
    if (sec != null) {
       sec.checkConnect(host, -1);
    }
}

/* now get all the IP addresses for this hostname,
 * and make sure one of them matches the original IP
 * address. We do this to try and prevent spoofing.
 */

 InetAddress[] arr = InetAddress.getAllByName0(host, check);

Nesse código, a variávelhost contém o valor correto, mas a última instrução que chamagetAllByName0 lança umUnknownHostException que é tratado retornando apenas o IP solicitado. A exceção é lançada pelo método internogetAddressesFromNameServicecom mensagem:"java.net.UnknownHostException: baiduspider-123-125-71-75.crawl.baidu.com"

Não sei porque.

Posso obter ohost valor da variável, ignorando a exceção interna?

questionAnswers(2)

yourAnswerToTheQuestion