複数のインターフェイスといくつかのヌル MAC アドレス (VMWare がインストールされた Windows 7 で Java 7 を実行している (仮想ネットワーク アダプターがいくつかあります)) を考慮すると、次のコードが機能するようです。
public static void main(String[] args) {
try {
InetAddress ip = InetAddress.getLocalHost();
System.out.println("Current IP address : " + ip.getHostAddress());
Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();
while(networks.hasMoreElements()) {
NetworkInterface network = networks.nextElement();
byte[] mac = network.getHardwareAddress();
if(mac != null) {
System.out.print("Current MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println(sb.toString());
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e){
e.printStackTrace();
}
}
これは、コンピューターを実行したときにコンピューターに表示されるもの (のサニタイズ バージョン) です。
Current IP address : {I'm not telling :)}
Current MAC address :
Current MAC address : {actual hardware interface}
Current MAC address : 00-00-00-00-00-00-00-E0
Current MAC address : 00-00-00-00-00-00-00-E0
Current MAC address : 00-00-00-00-00-00-00-E0
Current MAC address : 00-00-00-00-00-00-00-E0
Current MAC address : 00-00-00-00-00-00-00-E0
Current MAC address : 00-50-56-C0-00-01
Current MAC address : 00-50-56-C0-00-08
そして、これが実行の出力ですipconfig /all
C:\>ipconfig /all
Windows IP Configuration (minus any actual interface because I don't like sharing that kind of information :)
Ethernet adapter Local Area Connection 2:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Gbridge Virtual Private Network Adapter
Physical Address. . . . . . . . . : 02-50-F2-CE-82-01
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Ethernet adapter VMware Network Adapter VMnet1:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet1
Physical Address. . . . . . . . . : 00-50-56-C0-00-01
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::9c27:3d03:da2c:f14d%19(Preferred)
Autoconfiguration IPv4 Address. . : {Hidden}(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.0.0
Default Gateway . . . . . . . . . :
DHCPv6 IAID . . . . . . . . . . . : 268456022
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-13-DB-D9-CB-B8-AC-6F-AF-9D-F2
DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
NetBIOS over Tcpip. . . . . . . . : Enabled
Ethernet adapter VMware Network Adapter VMnet8:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
Physical Address. . . . . . . . . : 00-50-56-C0-00-08
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::cdbb:434:7fd9:2574%20(Preferred)
IPv4 Address. . . . . . . . . . . : 192.168.42.1(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
DHCPv6 IAID . . . . . . . . . . . : 285233238
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-13-DB-D9-CB-B8-AC-6F-AF-9D-F2
DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
fec0:0:0:ffff::2%1
fec0:0:0:ffff::3%1
NetBIOS over Tcpip. . . . . . . . : Enabled
Tunnel adapter 6TO4 Adapter:
Description . . . . . . . . . . . : Microsoft 6to4 Adapter
Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
IPv6 Address. . . . . . . . . . . : 2002:204c:1bc6::204c:1bc6(Preferred)
Default Gateway . . . . . . . . . :
NetBIOS over Tcpip. . . . . . . . : Disabled
Tunnel adapter isatap.{3E45CB42-BC1E-4F89-9C16-25166C0EABA1}:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Microsoft ISATAP Adapter
Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
Tunnel adapter isatap.{77F1FADC-02BA-44AF-9FDF-97E23F8B5FE7}:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #3
Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
Tunnel adapter isatap.{608257AC-C0F3-43A5-8595-898533C95D90}:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Microsoft ISATAP Adapter #5
Physical Address. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
InetAddress.getLocalHost().getHostAddress()
この混乱から「ただ 1 つの値」を取得する際の課題は、 とネットワーク インターフェイス自体の関係にあります。この最初のプログラムのわずかに拡張されたバージョンを考えてみましょう (この非常にクールなIterableEnumerationユーティリティ クラスを使用):
public static void main(String[] args) throws UnknownHostException, SocketException {
System.out.println("Current IP address : " + InetAddress.getLocalHost().getHostAddress());
for(NetworkInterface network : IterableEnumeration.make(NetworkInterface.getNetworkInterfaces())) {
byte[] mac = network.getHardwareAddress();
if(mac != null) {
System.out.print("Current MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println(sb.toString());
//Bound InetAddress for interface
for(InetAddress address : IterableEnumeration.make(network.getInetAddresses())) {
System.out.println("\tBound to:"+address.getHostAddress());
}
}
}
}
これをコンピュータで実行すると、現在の IP アドレスが 1 つのアダプタに関連付けられていることがわかりますが、ハードウェア インターフェイスの MAC アドレスはそれ自身を別の IP アドレスとして認識します。おそらく、仮想アドレスを除外するか、利用可能なすべてのアドレスを利用する方法を見つけることができます.