2011-09-28 69 views
1

我在編寫虛擬路由器。我的第一個任務是構建一個以太網幀。我目前正在嘗試獲取MAC源地址。我有代碼獲取我的機器上使用的所有MAC地址,但我有一個virtualbox主機網絡,所以代碼也抓取了這個MAC地址。我無法通過編程確定我的以太網幀應該使用哪個MAC地址。這是我當前的代碼在java中獲取正確的非虛擬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; 
} 

回答

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

+2

謝謝!我用你的技術連接到公共服務器。它像一個魅力。 –