InetAddress.getCanonicalHostName() 返回 IP 而不是 Hostname编辑 #1
我寻找如何在Stack Overflow上的Java中进行IP查找,但答案与我已经在做的事情相匹配,并没有解决我的问题。
这是我的代码:
public void printHostname( String ip ) {
System.out.println( InetAddresses.forString( ip ).getCanonicalHostName( ) );
}
InetAddresses
只是番石榴库中的一个实用程序类,用于获取 .InetAdress
问题:此代码在某些 IP 地址上按预期工作,而不适用于其他一些 IP 地址。
一个工作示例
例如,对于 IP 157.55.39.29,输出为:
msnbot-157-55-39-29.search.msn.com
根据 Linux 命令,此结果似乎是正确的:host
> host 157.55.39.29
29.39.55.157.in-addr.arpa domain name pointer msnbot-157-55-39-29.search.msn.com.
一个不起作用的示例
对于 IP 123.125.71.75,该命令返回:host
> host 123.125.71.75
75.71.125.123.in-addr.arpa domain name pointer baiduspider-123-125-71-75.crawl.baidu.com.
但是我的Java代码的输出是:
123.125.71.75
而预期输出应为
baiduspider-123-125-71-75.crawl.baidu.com
getCanonicalHostName 方法的 javadoc 说:
返回:
此IP地址的完全限定域名,或者如果安全检查不允许该操作,则以文本表示该IP地址。
但我非常确定这不是安全检查的问题...或者我不明白出了什么问题。
你有什么建议来解释这种行为吗?您有解决方法吗?
编辑 #1
在寻找解决方案时,我试图在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);
在此代码中,变量包含正确的值,但最后一个调用的语句将引发一个,该值通过仅返回请求的 IP 进行处理。该异常由内部方法引发,消息为:“java.net.UnknownHostException: baiduspider-123-125-71-75.crawl.baidu.com”
host
getAllByName0
UnknownHostException
getAddressesFromNameService
我不知道为什么。
我可以绕过内部异常获取变量值吗?host