2011-12-16 18 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がこのマシンで実行するVMをサポートするためにそこに置かれました)。 NetworkInterfaceを介して、実際のものではないものを検出できる方法があるのですか、それとも、実際の対応点(en1など)と区別できないのでしょうか?私は、その名前がen0またはen1の場合、その本物のような名前に依存するように頼らざるを得ないことを嫌うでしょう。何か案は?

答えて

2

MACの前半は、ベンダーコードと同じように調べることができます。大部分のベンダーは、おそらく物理的または仮想的(両方ではない)のデバイスを作っています。

このアプローチでは、100%のケースに当たることはありませんが、使用には十分な可能性があります。

誰かがMACアドレスを偽装している場合でも、あなたを助けません。

ここで何をしようとしていますか?あなたの究極の目標について説明したら、別のアプローチがあるかもしれません。

+0

私の究極の目標は、リッチで速く、このゲームをチェックアウトすることですが、それは今は問題ではありません。 MACアドレスのバイトを取得して、UUIDの作成をシードしようとします。 java.util.UUIDはデフォルトでは乱数ですが、MACアドレスを使ってよりうまくいくかどうか疑問に思っていました。それは私がこれで行くところです。シードUUIDのMACアドレス。 –

+0

ランダムなUUIDは、すべての合理的な目的に十分に十分です。 UUIDを播種する独自の方法を発明することは、あなたのスキームがより良いことを示すために数学をすべて実行していない限り、事態を悪化させることはほぼ確実です... UUID.randomUuid() –

0

完全にテストされていませんが、試してみましたか?NetworkInterfaceです。 isVirtual()?ドキュメントから:

このインターフェイスが仮想インターフェイス(サブインターフェイスとも呼ばれます)かどうかを返します。仮想インタフェースは、一部のシステムでは、物理インタフェースの子として作成され、異なる設定(アドレスやMTUなど)が与えられます。通常、インタフェースの名前は、親の名前にコロン(:)と子を識別する番号が続き、単一の物理インタフェースに複数の仮想インタフェースが接続されている可能性があるためです。

+0

コードはすでにisVirtual()とisLoopback()をフィルタリングしているので、その意味でのvnicsは "real"です。さらに、彼らはヌルの親を持っているので、discriminatorもいいです。この小さな問題は、私のMACアドレスの理解を広げています。そのようなものはただ一つ割り当てることができます。 –

+0

あなたは本当に1つを割り当てることができますが、MACアドレスは偽造不可能ではありません。 :) – Bombe

+1

しかし、MACアドレスの一部はベンダーコードです。 "001C42"は "Parallels、Inc."のベンダーコードです。仮想仲介業者のベンダーの小さなデータベースが必要なものだけかもしれません。 – Bombe

関連する問題