2011-12-16 58 views
2

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

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放在那里以支持我有时在这台机器上运行的虚拟机)。有没有通过NetworkInterface的方法可以检测到“真实”的或者它们与实际的对应物无法区分,比如“en1”?我讨厌不得不依靠名字,比如“它的名字是en0还是en1”。有任何想法吗?

回答

2

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

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

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

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

0

完全未经测试,但您试过NetworkInterfaceisVirtual()?从文档:

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

+0

代码已经过滤掉isVirtual()和isLoopback(),所以在这个意义上,vnics是“真实的”。此外,他们有空父母,所以歧视也不好。这个小问题扩大了我对MAC地址的理解。它就像你可以分配一个。 – 2011-12-16 08:10:22

+0

你确实可以分配一个,mac地址是不可伪造的。 :) – Bombe 2011-12-16 12:29:25