如何测试Java中是否确实存在给定的主机名?
问题在于一些像Opendns这样的DNS服务即使对于不存在的DNS条目也会返回IP地址,因此,InetAddress.getByName( host)
将始终返回一些内容。
但是,host
命令能够以某种方式检测到它:
~$ host owqieyuqowiery.com
owqieyuqowiery.com has address 67.215.77.132
Host owqieyuqowiery.com not found: 3(NXDOMAIN)
答案 0 :(得分:4)
取决于你的意思“真的存在”。你的意思是它是一个注册域名,背后有一个网站吗?与给定系统的IP地址相比,主机名只是一种更易读/可记忆的形式。换句话说,我可以注册一个域名(这只是某个系统的公共可访问的短名称),而不是在所述域指向的服务器上托管一个网站,这不会使域名变得更少“真正的”。
如果您只想查找A
条记录,这是一个解决方案:
如果你想知道host
做了什么,这可能会说明它为什么会这样做,这里有一些信息:http://linux.die.net/man/1/host基本上当这失败时,它意味着DNS查找失败。也就是说,host
为了查找该域而连接的DNS服务器返回零结果。
此外,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 :(得分:2)
改为使用InetAddress.getByName(address).isReachable(timeout);
。
答案 2 :(得分:1)
如果您无法信任本地配置的解析程序(可能因为它位于不存在的域),唯一的选择是直接查询权威名称服务器( s)对于相关领域。
对于Java,应该可以使用dnsjava
库。
您需要从根名称服务器开始,然后按照引用链(以与普通递归服务器相同的方式)查找相应的权威名称服务器。