1

我在路由器中添加了一个静态 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()

  1. 为什么会ping找不到主机nslookup呢?
  2. 为什么启动 VM 会导致ping开始看到主机?请记住,与找到ping主机could not find builds-mac相反,但由于主机已关闭而没有得到任何响应。后者是预期的,但前者不是。

更新2:所以,我发现了三个更有趣的线索......

  1. 无论何时ping工作都是如此InetAddress.getByName()。情况并非如此nslookup
  2. 默认情况下,路由器没有分配域名。在此模式下,nslookup始终有效但ping无效。
  3. 如果我为路由器分配一个域名并续订 [1] 进行查找的计算机的租约,则ping开始工作。

[1] 重新启动计算机或运行ipconfig /renew会选择新域名,但ipconfig /flushdns不会。

所以,这让我们回到了最初的问题:

为什么 Windows 客户端解析器(ping引擎盖下的用途)需要域名后缀?我的意思是,即使没有它也不应该工作吗?

4

0 回答 0