java - 为什么 Inet6Address.getByAddress 需要主机名和直接地址字节?

标签 java networking

https://docs.oracle.com/javase/7/docs/api/java/net/Inet6Address.html

public static Inet6Address getByAddress(String host,
                        byte[] addr,
                        int scope_id)

Inet6Address 应该包含诸如 sockaddr_in6 之类的东西,没有端口号(16 个地址字节加上 scope_id,如果是本地链路),至少我是这么认为的。给定 16 个字节和作用域 ID,我认为 Inet6Address 应该被完全指定,而不需要更多位。然而还有额外的参数 host...

文档链接到 InetAddr.getByAddress(String,byte[]) 的解释,其中还包含不清楚的片段:

Creates an InetAddress based on the provided host name and IP address. No name service is checked for the validity of the address.
The host name can either be a machine name, such as "java.sun.com", or a textual representation of its IP address.

No validity checking is done on the host name either.

如果没有 DNS 那么为什么在已经提供了字节的情况下还需要主机名?它可以与 null 而不是 host 一起使用吗?为什么没有 getByAddress 只有 addrscope_id(没有 host)?

最佳答案

首先,有一个工厂方法只接受字节数组并执行您期望的操作:

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);

但是,我们对主机名部分感兴趣,所以让我们阅读 documentation对于 getHostName():

Gets the host name for this IP address.

If this InetAddress was created with a host name, this host name will be remembered and returned;otherwise, a reverse name lookup will be performed and the result will be returned based on the system configured name lookup service.

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

InetAddress ip = InetAddress.getByAddress("foo", addr);

然后 getHostName() 将简单地打印 我们 提供的主机名 (foo) 而无需任何查找。

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

An instance of an InetAddress consists of an IP address and possibly its corresponding host name (depending on whether it is constructed with a host name or whether it has already done reverse host name resolution).

关于java - 为什么 Inet6Address.getByAddress 需要主机名和直接地址字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330485/

相关文章:

sql - 随机遇到网络路径未找到异常

Java - 如何对通用 ArrayList 进行子类化,以便 MyArrayList<foo> 的实例成为 ArrayList<foo> 的子类?

java - 是否可以在Alertdialog中创建GridView?

c - Arduino 处理开放网络套接字

java - 使用 kryo 注册类(class)的策略

c++ - 为什么关闭 udp 套接字 block ?

python - 在 Python 中查询 TCP 套接字连接状态

java - Dataweave 停止从输入负载端的查询中拾取 Java linkedList 数据

java - 编译器说变量尚未初始化

java - 批量条目 0 插入借方(金额、cid、描述、did)值 ('100'、0、 'rajesh'、5)已中止 : ERROR: insert or update on table "debit"