在java中获取正确的非虚拟MAC地址

时间:2011-09-28 18:15:12

标签: java mac-address

我正在编写虚拟路由器。我的第一个任务是构建以太网帧。我目前正在尝试获取MAC源地址。我的代码可以获取我的机器上使用的所有MAC地址,但我有一个虚拟机主机网络,所以代码也抓住了这个MAC地址。我无法以编程方式确定我应该为以太网帧使用哪个MAC地址。这是我目前的代码

private byte[] grabMACAddress(){
    try{ 
        InetAddress[] addresses = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());

        for(int i = 0; i < addresses.length; i++){
            NetworkInterface ni = NetworkInterface.getByInetAddress(addresses[i]);


            mac = ni.getHardwareAddress();
            if (mac != null){
                for(int j=0; j < mac.length; j++) {
                                        String part = String.format("%02X%s", mac[j], (j < mac.length - (1)) ? "" : "");
                                        s += part;
                }
                System.out.println();
            }
            else{
                System.out.println("Address doesn't exist or is not accessible.");
            }

        }
    }
    catch(IOException e){

    }
            System.out.println(s);
            return mac;
}

1 个答案:

答案 0 :(得分:2)

支持隔离多个网络接口是特定于操作系统的,因此Java中没有内置支持。

找到“主要”IP地址的一种简单方法是连接到公共服务器,并检查用于连接的“客户端地址”:

    Socket socket= new Socket();
    SocketAddress endpoint= new InetSocketAddress("www.google.com", 80);
    socket.connect(endpoint);
    InetAddress localAddress = socket.getLocalAddress();
    socket.close();
    System.out.println(localAddress.getHostAddress());
    NetworkInterface ni = NetworkInterface.getByInetAddress(localAddress);
    byte[] mac = ni.getHardwareAddress();
    StringBuilder s=new StringBuilder();
    if (mac != null){
        for(int j=0; j < mac.length; j++) {
                                String part = String.format("%02X%s", mac[j], (j < mac.length - (1)) ? "" : "");
                                s.append(part);
        }

        System.out.println("MAC:" + s.toString());
    }
    else{
        System.out.println("Address doesn't exist or is not accessible.");
    }

除此之外,您可能希望研究基于JNI的低级库来处理低级网络协议,甚至查找路由表。像http://jnetpcap.com/之类的东西对你来说可能很有趣。

HTH