java.net.NetworkInterface.getNetworkInterfaces()查找“真实”接口

时间:2011-12-16 07:58:12

标签: java

我对NetworkInterface.getNetworkInterfaces()的返回值有点困惑。我试图筛选NetworkInterface对象列表,找出哪些是“真实的”(由实际硬件支持)。代码看起来像......

Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while ( e.hasMoreElements() ) {
    NetworkInterface iface = (NetworkInterface) e.nextElement();
    if ( !iface.isLoopback() && !iface.isVirtual() ) {
        byte[] macAddress = iface.getHardwareAddress();
        String message = String.format(
            "%s %s parent: %s",
            iface.getName(),
            byteArrayToHexString( macAddress ),
            iface.getParent() );
        System.out.println( message );
    }
}

...和输出一样......

vnic1 00 1C 42 00 00 09  parent: null
vnic0 00 1C 42 00 00 08  parent: null
en1 60 33 4B 20 C4 97  parent: null

我知道“vnic1”和“vnic0”并不是“真实的”(Parallels将它们放在那里以支持我有时在这台机器上运行的VM)。有没有办法通过NetworkInterface我可以检测到不是“真正的”或者它们实际上与它们的实际对应物无法区分,比如“en1”?我不愿意诉诸于依赖名称,如“如果它的名字是en0或en1那么真实”。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以查找MAC的前半部分,因为它是供应商代码。大多数供应商可能制造物理或虚拟(而非两者)设备。

使用这种方法你不会达到100%的情况,但它可能“足够好”供您使用。

如果有人欺骗MAC地址,它也无济于事。

你想在这做什么?如果你解释了你的最终目标,也许还有另一种方法。

答案 1 :(得分:0)

完全未经测试,但您是否尝试过NetworkInterfaceisVirtual()?来自文档:

  

返回此接口是否为虚拟接口(也称为子接口)。在某些系统上,虚拟接口是作为物理接口的子级创建的接口,并且具有不同的设置(如地址或MTU)。通常,接口的名称将是父名称,后跟冒号(:)和标识子项的数字,因为可以有多个虚拟接口连接到单个物理接口。