对于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地址,它也不会帮助您。
您想在这里做什么?如果您解释自己的最终目标,也许还有另一种方法。