Различное поведение InetSocketAddress#getHostName в Windows и Linux для 127.0.0.1

InetAddress.getByName("127.0.0.1").getHostName()

Приведенный выше String в Windows возвращает 127.0.0.1, но в Linux он возвращает localhost.

Документы InetAddress#getHostName говорит:

Если этот InetAddress был создан с именем хоста, это имя хоста будет запомнено и возвращено; в противном случае будет выполнен обратный поиск имени, и результат будет возвращен на основе службы поиска имени, настроенной системой.

  • Это ожидаемое поведение?
  • Почему такое несоответствие для разных ОС?
  • Дело в том, что служба поиска имен для Linux и Windows отличается, и поэтому мы видим эту разницу в поведении?

Я видел этот вопрос, но мой вопрос касается разницы в поведении API в windows и linux и в чем причина этой разницы.


person Lavish Kothari    schedule 04.04.2019    source источник
comment
Цитата неактуальна. Этот InetAddress был создан с использованием IP-адреса, а не имени хоста.   -  person user207421    schedule 05.04.2019


Ответы (1)


Итак, принципиальной разницы между Windows и Linux нет. Однако есть разница в конфигурации этих двух устройств. Как указано в вопросе, на который вы ссылались, это зависит от того, что находится внутри файла hosts. Это файл, который есть как в Windows, так и в Linux, и он сообщает ОС, какие IP-адреса могут быть назначены определенным именам хостов. Вот пример записи в файле:

127.0.0.1    localhost

Это сообщит ОС, что если я сделаю запрос к localhost, просто направлю запрос к 127.0.0.1. Это похоже на то, что делает DNS-сервер, но процесс происходит на вашем компьютере, без проверки Интернета.

Теперь о том, почему эта строка меняется на разных платформах. В документации сказано следующее:

Если этот InetAddress был создан с именем хоста, это имя хоста будет запомнено и возвращено; в противном случае будет выполнен обратный поиск имени, и результат будет возвращен на основе настроенной системой службы поиска имен. Если требуется поиск службы имен, вызовите getCanonicalHostName.

Этот раздел относится к имени хоста, указанному в файле hosts. В вашей системе Linux файл hosts имеет запись, похожую на приведенную выше (что довольно часто встречается в средах Linux). Java замечает это и возвращает его вместо IP. Поскольку в Windows такой записи нет, вместо этого просто возвращается IP.

person Fishy    schedule 04.04.2019