我正在尝试使用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,则会发生异常。
我对这些东西不熟悉所以非常感谢任何帮助。感谢。
答案 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();
}