我对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那么真实”。有什么想法吗?
答案 0 :(得分:2)
您可以查找MAC的前半部分,因为它是供应商代码。大多数供应商可能制造物理或虚拟(而非两者)设备。
使用这种方法你不会达到100%的情况,但它可能“足够好”供您使用。
如果有人欺骗MAC地址,它也无济于事。
你想在这做什么?如果你解释了你的最终目标,也许还有另一种方法。
答案 1 :(得分:0)
完全未经测试,但您是否尝试过NetworkInterface。isVirtual()?来自文档:
返回此接口是否为虚拟接口(也称为子接口)。在某些系统上,虚拟接口是作为物理接口的子级创建的接口,并且具有不同的设置(如地址或MTU)。通常,接口的名称将是父名称,后跟冒号(:)和标识子项的数字,因为可以有多个虚拟接口连接到单个物理接口。