2011-12-16 66 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