为什么Java的InetAddress类没有将ipv6地址解析为其FQDN?

时间:2011-01-03 23:14:58

标签: java networking dns ipv6 fqdn

我正在尝试使用Java编写一个简单的程序,如果采用版本4或6格式的IP,它将返回其FQDN。给定ipv4地址时,以下代码可以正常工作,但只有在输入ipv6地址时才会返回给定的地址。

InetAddress inet;
try { inet = InetAddress.getByName(theIpAddress); }
catch(UnknownHostException e) { System.out.println("Unknown Host"); return; }

System.out.println(inet.getHostAddress(););
System.out.println(inet.getHostName(););

每当我输入ipv6时,getHostName()将只返回相同的ipv6,即使我知道ipv6将解析为FQDN。此外,如果我输入ipv6主机名(例如ipv6.google.com)代替ipAddress,则会发生异常。

我对这些东西不熟悉所以非常感谢任何帮助。感谢。

4 个答案:

答案 0 :(得分:2)

问题实际上是我正在运行的Java版本。从1.6.21将Java更新到1.6.23,允许ipv6s解析为他们的FQDN。

答案 1 :(得分:2)

我已经快速调查了主机名< - >的情况。 java 8,Windows 7中的ipv6解析。 看起来像'默认'NameService根本不适用于ipv6! 但! Java附带了另一个基于JNDI的NameService实现,名为'dns,sun'。 因此,如果您使用

启用它
  

-Dsun.net.spi.nameservice.provider.1 = DNS,太阳

System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");

您将获得双向ip< - >像这样的v4和v6地址的主机名解析

InetAddress.getAllByName(...)
address.getHostName()

有关java ipv6的更多信息,请点击此处http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

答案 2 :(得分:1)

尝试inet.getCanonicalHostName();“获取此IP地址的完全限定域名。”

如果使用InetAddress.getByName()构造InetAddress,getHostName()将返回您构建它的内容。 getCanonicalHostName()强制进行反向名称查找。

答案 3 :(得分:-2)

使用java.net.InetAddress不可能有ipv6和ipv4名称解析等。像getByName等一堆静态方法将查找委托给Inet4(or 6)AddressImpl的实例

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException;

现在好玩的是a)所有这些都是私有/包本地所以没有办法将impl类注入InetAddress类b)Inet4(或6)AddressImpl类本身是包本地的。所以没有办法说,动态执行ipv4或ipv6查找/名称解析。我没有得到这些类的所有扩展点被阻止的方式,使得它们的使用和灵活性非常有限。    真正的黑魔法在这里发生,其中InetAddress类静态初始化impls,对于方法的结果是什么,ipv6Supported()依赖?我的Linux设置支持ipv6,我可以为ipv6主机名(如ipv6.google.com)进行dns查找。  如果有人能够指出我在java中使用ipv4 / v6实用程序(例如查找等)的好网库的方向,我将不胜感激。

class InetAddressImplFactory {

    static InetAddressImpl create() {
    Object o;
    if (isIPv6Supported()) {
        o = InetAddress.loadImpl("Inet6AddressImpl");
    } else {
        o = InetAddress.loadImpl("Inet4AddressImpl");
    }
    return (InetAddressImpl)o;
    }

    static native boolean isIPv6Supported();
}