Java getHostName错误?

时间:2013-09-03 12:30:55

标签: java dns

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

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

java是否使用与系统其他部分不同的DNS配置?有谁能解释这可能会发生什么? getHostName()还有其他选择吗?

2 个答案:

答案 0 :(得分:0)

getHostName

  

获取此IP地址的主机名。

getCanonicalHostName

  

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

答案 1 :(得分:0)

我认为这是一个相当古老的问题,但今天我遇到了同样的问题,看起来我找到了一个理由。 问题是,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;

我能说什么?省略顽皮的话 - 没什么。 由于这个lib是从Oracle JRE共享的,所以我们无能为力。