Java getHostName错误?

Java getHostName错误?,java,dns,Java,Dns,我在使用电脑时遇到问题 inetAddress.getHostName()java中的类。在某些情况下,java类没有得到正确的结果。在这种情况下,我只收到IP地址(正如错误时预期的那样) 这很可能是我们网络的dns配置中的错误。但是如果我将命令行与nslookup一起使用,我会得到正确的答案 java是否使用与系统其他部分不同的DNS配置?有人能解释这是怎么发生的吗? 对于getHostName(),是否有替代方法 获取此IP地址的主机名 获取此IP地址的完全限定域名 我知道这是一个很老的

我在使用电脑时遇到问题
inetAddress.getHostName()
java中的类。在某些情况下,java类没有得到正确的结果。在这种情况下,我只收到IP地址(正如错误时预期的那样)

这很可能是我们网络的dns配置中的错误。但是如果我将命令行与
nslookup
一起使用,我会得到正确的答案

java是否使用与系统其他部分不同的DNS配置?有人能解释这是怎么发生的吗? 对于
getHostName()
,是否有替代方法

获取此IP地址的主机名

获取此IP地址的完全限定域名


我知道这是一个很老的问题,但今天我遇到了同样的问题,看起来我找到了一个原因。 问题是,java(至少openjdk版本“1.8.0_121”)首先查找“PTR”记录,然后,如果找到任何结果,java会尝试执行“A”记录查找,将返回的“A”记录与查询的初始IP号进行比较。如果没有为“A”查询找到这样的IP,Java将不会返回“PTR”查找结果。他们称之为“防止欺骗”。以下是图书馆资料来源:

private static String getHostFromNameService(InetAddress addr, boolean check) {
String host = null;
for (NameService nameService : nameServices) {
    try {
        // 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);
        boolean ok = false;

        if(arr != null) {
            for(int i = 0; !ok && i < arr.length; i++) {
                ok = addr.equals(arr[i]);
            }
        }

        //XXX: if it looks a spoof just return the address?
        if (!ok) {
            host = addr.getHostAddress();
            return host;
        }

        break;
私有静态字符串getHostFromNameService(InetAddress addr,布尔检查){
字符串host=null;
for(名称服务名称服务:名称服务){
试一试{
//首先查找主机名
host=nameService.getHostByAddr(addr.getAddress());
/*检查是否允许调用代码知道
*此IP地址的主机名,即连接到主机
*/
如果(检查){
SecurityManager sec=System.getSecurityManager();
如果(秒!=null){
第二节检查连接(主机,-1);
}
}
/*现在获取此主机名的所有IP地址,
*并确保其中一个与原始IP匹配
*地址。我们这样做是为了防止欺骗。
*/
InetAddress[]arr=InetAddress.getAllByName0(主机,检查);
布尔ok=false;
如果(arr!=null){
对于(int i=0;!ok&&i
我能说什么呢?漏掉调皮的话-什么都没有。
因为这个库是从Oracle JRE共享的,所以我们没有别的办法了。

看看“getCanonicalHostName()另请参见:edit://当我记住正确的gethostname时,只返回计算机已知的主机名?获取规范主机名的行为对我来说没有什么不同。我只接收IP地址。可以使用此IP地址尝试nslookup,然后再次尝试gethostname。请多次报告您的结果,没有区别nce。我可以解决100个未知主机中的90个,没有问题。剩下的就产生了这种奇怪的行为。在java8/openjdk/linux上也有同样的问题。你找到解决这个问题的答案或解决方法了吗?对我来说,它们之间没有区别。我只收到IP地址。你是如何创建
InetAdress
?我正在使用getByName(“11.22.33.44”);你在什么操作系统上运行它?Win 7 SP1 Java version 1.7.0_17我已经看到了OSX和ubuntu的Java错误报告