我在路由器中添加了一个静态 DNS 条目,将一些 IP 地址绑定到builds-mac
. 然后我尝试使用 Java 查找它的 IP 地址:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Testcase
{
public static void main(String[] args) throws UnknownHostException
{
System.out.println("got: " + InetAddress.getByName("builds-mac"));
}
}
这失败了:
java.net.UnknownHostException: builds-mac
at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293)
at java.net.InetAddress.getAllByName0(InetAddress.java:1246)
at java.net.InetAddress.getAllByName(InetAddress.java:1162)
at java.net.InetAddress.getAllByName(InetAddress.java:1098)
at java.net.InetAddress.getByName(InetAddress.java:1048)
但是当我用builds.home.local
(相应地更新DNS条目)替换主机名时,操作成功了。
为什么InetAddress.getByName()
需要主机名后缀?是否可以使其适用于没有后缀的主机名?
(我在 Windows7 下运行 JDK 1.7.0_60,64 位)
更新:nslookup builds-mac
总是工作,而最初ping builds-mac
失败(could not find builds-mac
)但是当我在 VMWare 中启动虚拟机时,ping
开始工作。一旦ping
开始工作,也是如此InetAddress.getByName()
。
- 为什么会
ping
找不到主机nslookup
呢? - 为什么启动 VM 会导致
ping
开始看到主机?请记住,与找到ping
主机could not find builds-mac
相反,但由于主机已关闭而没有得到任何响应。后者是预期的,但前者不是。
更新2:所以,我发现了三个更有趣的线索......
- 无论何时
ping
工作都是如此InetAddress.getByName()
。情况并非如此nslookup
。 - 默认情况下,路由器没有分配域名。在此模式下,
nslookup
始终有效但ping
无效。 - 如果我为路由器分配一个域名并续订 [1] 进行查找的计算机的租约,则
ping
开始工作。
[1] 重新启动计算机或运行ipconfig /renew
会选择新域名,但ipconfig /flushdns
不会。
所以,这让我们回到了最初的问题:
为什么 Windows 客户端解析器(ping
引擎盖下的用途)需要域名后缀?我的意思是,即使没有它也不应该工作吗?