InetAddress getAllByName不管理主机条目中提到的返回IP地址的顺序

时间:2014-11-19 06:28:27

标签: java linux networking inetaddress

我的主持人条目如下:

    10.106.1.188 myhost
    192.168.0.156 myhost
    192.168.0.160 myhost
    192.168.0.150 myhost
    10.106.1.121 myhost
    10.106.1.110 myhost

我使用以下代码从主机条目中获取所有IP地址

InetAddress[] addresses = InetAddress.getAllByName("myhost");
    for( InetAddress address : addresses) {
        System.out.println(address);
    }

问题是上面的代码没有管理IP地址顺序。

在Windows 7上运行以上程序时,它工作正常,但在Linux机器上它不管理命令

3 个答案:

答案 0 :(得分:2)

我建议使用Comparator,它应该为您排序IP地址。另外,你将得到平台相关的结果。这是一个例子http://thilosdevblog.wordpress.com/2010/09/15/sorting-ip-addresses-in-java/ 此示例使订单保持不变。

答案 1 :(得分:1)

java.net.InetAddress.getAllByName返回的地址顺序未定义。如果它在一个平台上运行,那么它只是一个幸福的事故。

请记住,结果可能并非总是来自主机文件,而是来自DNS查找的结果(订单也未定义)。

答案 2 :(得分:0)

我在具有多个接口(IP地址)的 Windows 计算机上遇到类似问题。我注意到inetAddress.getAllByName()函数相应地返回IP列表它们的接口ID,即列表中最顶层的IP将是具有最高ID(OS特定内部列表)的接口的IP。您可以通过 Windows cmd行中的命令查找接口列表:route print

Interface List
  7...02 00 xx xx xx xx ......Microsoft KM-TEST Loopback Adapter
  3...fc aa xx xx xx xx ......Intel(R) Ethernet Connection I217-V
  8...02 01 xx xx xx xx ......SAMSUNG Mobile USB Remote NDIS Network Device
  4...00 e0 xx xx xx xx ......Realtek PCI GBE Family Controller
   .   .   .   .   .
  9...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
 32...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #4

因此,在此示例中,getAllByName()呼叫列表中的第一个IP将是接口8的IP( SAMSUNG Mobile USB Remote ... )。