对于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时为实数”之类的名字。有任何想法吗?

最佳答案

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

使用这种方法,您不会碰到100%的情况,但是对于您的使用来说,它可能“足够好”。

如果有人欺骗了MAC地址,它也不会帮助您。

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

09-25 23:18