Java 为什么Inet6Address.getByAddress同时需要主机名和直接地址字节?

Java 为什么Inet6Address.getByAddress同时需要主机名和直接地址字节?,java,networking,Java,Networking,Inet6Address应该包含类似于sockaddr\u in6sans端口号(16个地址字节加上作用域id,如果链接是本地的),至少我是这么认为的。给定16个字节和作用域id,我认为应该完全指定Inet6Address,而不需要进一步的位。但是还有额外的参数host 文档链接到InetAddr.getByAddress(字符串,字节[])的解释,其中还包含不清楚的代码片段: 根据提供的主机名和IP地址创建InetAddress。未检查姓名服务地址的有效性。 主机名可以是机器名,如“java.

Inet6Address
应该包含类似于
sockaddr\u in6
sans端口号(16个地址字节加上作用域id,如果链接是本地的),至少我是这么认为的。给定16个字节和作用域id,我认为应该完全指定
Inet6Address
,而不需要进一步的位。但是还有额外的参数
host

文档链接到
InetAddr.getByAddress(字符串,字节[])
的解释,其中还包含不清楚的代码片段:

根据提供的主机名和IP地址创建InetAddress。未检查姓名服务地址的有效性。
主机名可以是机器名,如“java.sun.com”,也可以是其IP地址的文本表示

也没有对主机名进行有效性检查


如果没有DNS,那么在已经提供字节的情况下为什么需要主机名呢?它是否可以使用
null
而不是主机?为什么没有带addr和scope id的getByAddress(不带主机)呢?

首先,有一种工厂方法,它只需要字节数组,就可以实现您所期望的:

byte[] addr = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
InetAddress ip = Inet6Address.getByAddress(addr);
但是,我们对主机名部分感兴趣,因此让我们阅读
getHostName()

获取此IP地址的主机名

如果此InetAddress是使用主机名创建的,则此主机名将 被记住和回报;否则,将执行反向名称查找 执行,并根据配置的系统返回结果 名称查找服务

我们构建了第一个没有主机名的IP地址,因此根据javadoc,调用
getHostName()
将执行实际的查找。这可能是我们想要的,也可能不是我们想要的,所以java给了我们第二个选择。如果我们这样构建地址:

InetAddress ip = InetAddress.getByAddress("foo", addr);
然后,
getHostName()
只需打印我们给出的主机名(
foo
),而无需任何查找

顺便说一句,相同的解释可以在for
InetAddress
本身中找到:

InetAddress的实例由IP地址和 其对应的主机名(取决于是否构造 使用主机名或是否已使用反向主机名 分辨率)。


“有一个工厂方法只接受字节数组,并执行您期望的操作”->是否有相应的方法接受字节数组和作用域id?@Vi.Kinda。通过传递主机名
null
,也会得到同样的效果。这并不好,因为这种行为在任何地方都没有文档记录,所以它可能会在Java版本甚至JDK实现之间发生变化。不过,这是我所知道的唯一等效API。我完全同意这是一个奇怪的API选择。
InetAddress ip = InetAddress.getByAddress("foo", addr);