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 trabalhoPor 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 funcionaPara 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 # 1Ao 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 internogetAddressesFromNameService
com 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?