【问题标题】:Unable to get all network interfaces with NetworkInterface.getNetworkInterfaces on Linux无法在 Linux 上使用 NetworkInterface.getNetworkInterfaces 获取所有网络接口
【发布时间】:2011-12-01 10:32:13
【问题描述】:

我需要打印我机器的所有 mac 地址。推荐的方法是使用 NetworkInterface.getNetworkInterfaces() 并迭代返回的枚举。但是,当某些设备宕机(配置了 NO Ip)时,上述方法将不会返回接口。

运行“ip addr”将返回以下内容

  1. lo: mtu 16436 qdisc noqueue 链接/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 范围主机 lo inet6 ::1/128 范围主机 valid_lft 永远首选_lft 永远
  2. G2: mtu 1500 qdisc pfifo_fast qlen 1000 链接/以太 00:03:b2:75:99:c2 brd ff:ff:ff:ff:ff:ff
  3. G1:mtu 1500 qdisc pfifo_fast qlen 1000 链接/以太 00:03:b2:75:99:c3 brd ff:ff:ff:ff:ff:ff inet 10.205.191.123/16 brd 10.205.255.255 范围全球 G1 inet6 fe80::203:b2ff:fe75:99c3/64 范围链接 valid_lft 永远首选_lft 永远
  4. eth2: mtu 1500 qdisc noop qlen 1000 链接/以太 00:03:b2:75:99:c4 brd ff:ff:ff:ff:ff:ff
  5. eth3: mtu 1500 qdisc noop qlen 1000 链接/以太 00:03:b2:75:99:c5 brd ff:ff:ff:ff:ff:ff

但是,当我运行 Java 代码时(即使以 root 身份或具有网络权限),我只能获得环回和 G1 接口。

这是我为测试目的编写的代码:

Enumeration<NetworkInterface> ni = NetworkInterface.getNetworkInterfaces();
while(ni.hasMoreElements()){
NetworkInterface nextElement = ni.nextElement();
byte[] mac = nextElement.getHardwareAddress();
if (mac != null) {
         StringBuffer macAddress = new StringBuffer();
         for (int i = 0; i < mac.length; i++) {
              macAddress.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""));
         }
         System.out.println(macAddress.toString());
}
}

输出为:00:03:B2:75:99:C3(G1)而已。

如果可能的话,我确实想要一个纯 Java 解决方案。
有什么想法吗?

【问题讨论】:

标签: java linux networking


【解决方案1】:

看起来“ip addr”显示了所有网络适配器,但并非所有适配器都配置了 Internet 地址。因此,Java 只返回网络接口,即配置的适配器。

【讨论】:

  • 这正是我的观点。 Java 应该返回所有适配器,无论它们是否已配置,并让开发人员决定如何继续。我认为 Java 文档在这方面是错误的:返回这台机器上的所有接口。如果在此机器上找不到网络接口,则返回 null。 注意:可以使用 getNetworkInterfaces()+getInetAddresses() 获取此节点的所有 IP 地址
  • 有网卡/适配器(硬件设备),有网络接口(通过网卡进行逻辑连接)。此外,您可以通过一张卡分配多个接口。所以,javadoc 是正确的,它返回接口。我怀疑没有简单的方法可以用 java 列出所有卡片,可能你必须使用一些原生的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2011-01-16
  • 1970-01-01
  • 2011-11-29
  • 2015-04-04
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多