NetworkInterface.getHardwareAddress() 在Windows 2008下的BUG

在Windows2008系统中使用特定Java代码获取MAC地址时遇到不一致问题,因系统存在多个网卡接口导致获取结果异常。通过调用UUID.randomUUID();方法后,虚拟网卡的MAC地址变为NULL,解决了这一问题。

今天遇到了一个特别怪的问题,在取MAC地址的时候,居然在Windows 2008下取到的跟XP的不一样。代码如下:

final Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
   while (interfaces.hasMoreElements()) {
    final NetworkInterface ni = interfaces.nextElement();
    if (ni.isLoopback() || ni.isPointToPoint() || ni.isVirtual())
     continue;
    byte[] macAddress = ni.getHardwareAddress();
    if (macAddress != null && macAddress.length > 0)
     return macAddress;
   }

 

上面代码的作用是要取得第一个MAC地址。后来发现Windows 2008下并不是取不到网卡的MAC的地址,而是因为windows 2008下多了几个网卡接口,类似eth0, eth1, eth2, ..., 而这些虚拟的网卡应该是没有MAC的地址的,但是JDK提供的函数居然能取到一个地址,造成不能取得正确的网卡地址。之前有同事也遇到过类似的情况,解决方案竟然这么简单,只需要在使用之前 调用一下UUID.randomUUID(); 就可以了。我写段测试程序也确实在调用之后,类似eth0, eth1之类的网卡MAC Address成NULL了。也不知道是JDK的问题,还是windows 2008的问题。

### `NetworkInterface.getByInetAddress()` 方法详解 `NetworkInterface.getByInetAddress(InetAddress addr)` 是一个静态方法,用于查找绑定了指定 Internet 协议 (IP) 地址的网络接口。该方法在需要根据特定 IP 地址定位其所属网络接口时非常有用。例如,在多网卡环境中,可以通过某个本地 IP 地址获取对应的物理网卡信息。 此方法返回一个 `NetworkInterface` 实例,表示与给定 IP 地址绑定的网络接口。若未找到匹配的接口,则返回 `null` [^2]。 示例代码如下: ```java import java.net.InetAddress; import java.net.NetworkInterface; public class GetByInetAddressExample { public static void main(String[] args) throws Exception { InetAddress localHost = InetAddress.getLocalHost(); NetworkInterface ni = NetworkInterface.getByInetAddress(localHost); if (ni != null) { System.out.println("找到绑定到 " + localHost.getHostAddress() + " 的网络接口: " + ni.getName()); } else { System.out.println("未找到绑定到 " + localHost.getHostAddress() + " 的网络接口"); } } } ``` --- ### `NetworkInterface.getHardwareAddress()` 方法详解 `getHardwareAddress()` 方法用于获取当前网络接口的硬件地址(通常是 MAC 地址)。该方法返回一个 `byte[]` 类型的数组,表示硬件地址。如果接口没有硬件地址(如回环接口)或当前权限不足以访问该地址,则返回 `null` [^2]。 MAC 地址通常以冒号或连字符分隔的十六进制格式表示,例如:`00:1A:2B:3C:4D:5E`。为了将 `byte[]` 转换为标准格式,可以使用如下方式: ```java import java.net.NetworkInterface; import java.util.Enumeration; public class MacAddressExample { public static void main(String[] args) throws Exception { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); byte[] mac = ni.getHardwareAddress(); if (mac != null) { 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(ni.getName() + " MAC 地址: " + sb.toString()); } } } } ``` 通过这种方式,可以获取系统中所有支持硬件地址的网络接口,并将其转换为可读性更强的字符串形式 [^1]。 --- ### 综合应用:结合 `getByInetAddress` 和 `getHardwareAddress` 在实际开发中,有时需要根据 IP 地址获取对应网卡的 MAC 地址。以下是一个完整示例,演示如何通过本地 IP 获取网络接口并提取其 MAC 地址: ```java import java.net.InetAddress; import java.net.NetworkInterface; public class IpToMac { public static void main(String[] args) throws Exception { InetAddress localHost = InetAddress.getLocalHost(); NetworkInterface ni = NetworkInterface.getByInetAddress(localHost); if (ni != null) { byte[] mac = ni.getHardwareAddress(); if (mac != null) { 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("本地 IP " + localHost.getHostAddress() + " 对应的 MAC 地址: " + sb.toString()); } else { System.out.println("该接口不支持硬件地址"); } } else { System.out.println("未找到与 IP 地址匹配的网络接口"); } } } ``` 此代码展示了从 IP 地址出发,最终获取 MAC 地址的完整流程,适用于需要基于网络配置进行设备识别或安全验证的场景 [^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值