【问题标题】:InetAddress getAllByName does not manage order of return IP Addresses as mentioned in host entryInetAddress getAllByName 不管理主机条目中提到的返回 IP 地址的顺序
【发布时间】:2014-11-19 06:28:26
【问题描述】:

我的主机条目如下:

    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 机器上它不管理订单

【问题讨论】:

  • 什么是getIpAddressByHostName()? JDK中没有这种方法。
  • 抱歉,它的 InetAddress.getAllByName(hostName),请参阅已编辑的问题 感谢更正
  • Javadoc 中没有关于特定订单的任何内容。

标签: java linux networking inetaddress


【解决方案1】:

我建议使用 Comparator 来为您排序 IP 地址。否则,您将获得平台相关的结果。这是一个例子http://thilosdevblog.wordpress.com/2010/09/15/sorting-ip-addresses-in-java/ 此示例保持 Ordering 不变。

【讨论】:

  • 但我希望所有 IP 地址都按主机条目中的顺序排列
【解决方案2】:

java.net.InetAddress.getAllByName 返回的地址顺序未定义。如果它适用于您的一个平台,那么这只是一个快乐的意外。

请记住,结果可能并不总是来自主机文件,而是来自 DNS 查找的结果(其中的顺序也未定义)。

【讨论】:

    【解决方案3】:

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

    接口列表 7...02 00 xx xx xx xx ......Microsoft KM-TEST 环回适配器 3...fc aa xx xx xx xx ......英特尔(R) 以太网连接 I217-V 8...02 01 xx xx xx xx ......SAMSUNG 移动 USB 远程 NDIS 网络设备 4...00 e0 xx xx xx xx ......Realtek PCI GBE 系列控制器 . . . . . 9...00 00 00 00 00 00 00 e0 Microsoft ISATAP 适配器 #3 32...00 00 00 00 00 00 00 e0 Microsoft ISATAP 适配器 #4

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2020-04-06
      • 2015-10-08
      相关资源
      最近更新 更多