Почему для Inet6Address.getByAddress требуются как байты имени хоста, так и байты прямого адреса? - PullRequest
4 голосов
/ 10 октября 2019

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, если link-local), по крайней мере, то, что я думаю об этом. Учитывая 16 байтов и идентификатор области видимости, я предполагаю, что Inet6Address должен быть полностью указан, без необходимости в дополнительных битах. Еще есть дополнительный аргумент host ...

Документация ссылается на объяснение InetAddr.getByAddress(String,byte[]), которое также содержит неясный фрагмент:

Создает InetAddress на основе предоставленного имени хостаи IP-адрес. Никакая служба имен не проверяется на действительность адреса.
Имя хоста может быть именем машины, например «java.sun.com», или текстовым представлением его IP-адреса.

Проверка имени хоста также не выполняется.

Если нет DNS, то зачем вообще нужно имя хоста, если уже есть предоставленные байты? Будет ли он работать с null вместо хоста? Почему нет getByAddress только с addr и scope_id (без host)?

1 Ответ

4 голосов
/ 10 октября 2019

Прежде всего, существует фабричный метод, который принимает только байтовый массив и выполняет то, что вы ожидаете:

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) без поиска.

Кстати, то же самое объяснение можно найти в javadoc для самого InetAddress:

Экземпляр InetAddress состоит из IP-адреса и, возможно, соответствующего хоста. имя (в зависимости от того, создан ли он с именем хоста или уже выполнил обратное разрешение имени хоста).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...