Получить правильный не виртуальный MAC-адрес в Java - PullRequest
1 голос
/ 28 сентября 2011

Я программирую виртуальный маршрутизатор.И моя первая задача - построить фрейм Ethernet.В настоящее время я пытаюсь получить MAC-адрес источника.У меня есть код, который получает все MAC-адреса, используемые на моей машине, но у меня есть хост-сеть virtualbox, поэтому код также захватывает этот MAC-адрес.У меня возникают проблемы с программным определением MAC-адреса, который я должен использовать для своего кадра Ethernet.Это мой текущий код

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 Ответ

2 голосов
/ 29 сентября 2011

Поддержка изоляции нескольких сетевых интерфейсов зависит от ОС, поэтому в 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/.

НТН

...