首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中获取正确的非虚拟MAC地址

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

Stack Overflow用户
提问于 2011-09-29 02:15:12
回答 1查看 2.8K关注 0票数 1

我正在给一个虚拟路由器编程。我的第一个任务是构建一个以太网帧。我当前正在尝试获取MAC源地址。我有代码来获取我的机器上正在使用的所有MAC地址,但是我有一个virtualbox主机网络,所以代码也获取了这个MAC地址。我在以编程方式确定应将哪个MAC地址用于以太网帧时遇到了问题。这是我当前的代码

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-29 04:42:56

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

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

代码语言:javascript
复制
    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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7587612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档