#java #dns
#java #dns
Вопрос:
Как проверить, действительно ли указанное имя хоста существует в Java?
Проблема заключается в некоторых службах DNS, таких как Opendns, которые возвращают IP-адрес даже для несуществующих записей DNS и, следовательно, InetAddress.getByName( host)
всегда что-то возвращают.
Однако host
команда может каким-то образом его обнаружить:
~$ host owqieyuqowiery.com
owqieyuqowiery.com has address 67.215.77.132
Host owqieyuqowiery.com not found: 3(NXDOMAIN)
Комментарии:
1. помогает ли этот проект? dnsjava.org/dnsjava-current/examples.html
2. если вы не можете доверять ответам из OpenDNS — ** не используйте их! **
3. @Alnitak Это не помогает, поскольку я не контролирую, где размещено мое программное обеспечение.
Ответ №1:
Зависит от того, что вы подразумеваете под «действительно существует». Вы имеете в виду, что это зарегистрированный домен с веб-сайтом за ним? Имя хоста — это просто более легко читаемая / запоминающаяся форма по сравнению с IP-адресом для данной системы. Другими словами, я мог бы зарегистрировать домен (который является просто общедоступным коротким именем для какой-либо системы где-нибудь), а не размещать веб-сайт на сервере, на который указывает указанный домен, и это не делает домен менее «реальным».
если вы просто хотите просмотреть A
записи, вот решение:
- Сообщение в блоге: http://mowyourlawn.com/blog/?p=8
- Код: http://mowyourlawn.com/files/DomainRecord.java.txt
Если вы хотите знать, что host
делает, что может пролить некоторый свет на то, почему оно делает то, что делает, здесь есть некоторая информация об этом: http://linux.die.net/man/1/host В основном, когда это не удается, это означает, что поиск DNS не удался. То есть DNS-серверы, к которым host
подключались для поиска в этом домене, вернули нулевые результаты.
Кроме того, host
возвращает больше, чем просто запись DNS A
(которая используется для веб-сайтов). Он также предоставит вам записи MX (почтового сервера) и т.д.
Пример:
$ host google.com
google.com has address 74.125.225.48
google.com has address 74.125.225.49
google.com has address 74.125.225.50
google.com has address 74.125.225.51
google.com has address 74.125.225.52
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
Комментарии:
1. В принципе, мне нужно знать, есть ли у него запись в DNS.
2. Ах, я обновил свой ответ, указав на некоторый пример кода, который кто-то написал.
Ответ №2:
Вместо этого используйте InetAddress.getByName(address).isReachable(timeout);
.
Комментарии:
1. Это довольно простой способ сделать это, но он только сообщит вам, возможно ли подключение через ICMP-запрос или TCP-соединение через порт 7, в отличие от сообщения о том, существуют ли записи DNS для указанного домена. docs.oracle.com/javase/6/docs/api/java/net /…
2. Дело в том, что isReachable вернет true для любого имени хоста, потому что это будет тестировать серверы Opendns.
Ответ №3:
Если вы не можете доверять локально настроенному распознавателю (возможно, потому, что он лжет о доменах, которые не существуют), единственной альтернативой является прямой запрос к авторитетным серверам имен для рассматриваемого домена.
Для Java это должно быть возможно с помощью dnsjava
библиотеки.
Вам нужно будет начать с корневых серверов имен и следовать по цепочке ссылок вниз (таким же образом, как на обычном рекурсивном сервере), чтобы найти соответствующий авторитетный сервер имен.
Комментарии:
1. Это отличный совет. У вас есть пример кода, который делает это с помощью
dnsjava
?