2012-11-17 87 views
1

我正在寫一個android應用程序,它應該通過WiFi發送廣播數據包。從ip地址獲得廣播地址的最佳方式是什麼?

目前我可以從WifiManager.getConnectionInfo().getIpAddress()獲得設備的IP地址,並通過用0替換最後一位數字來猜測廣播地址。但我真的不喜歡這種解決方案。

什麼是正確的方法?

回答

-1

您需要用255替換而不是0

如果您的目標是SDK 9或更高版本,則可以使用getBroadcast(),否則您需要覆蓋IP地址中的數字。

示例代碼:

public static InetAddress getNetworkLocalBroadcastAddressdAsInetAddress() throws IOException { 
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
     NetworkInterface intf = en.nextElement(); 
     if(VERSION.SDK_INT < 9) { 
      if(!intf.getInetAddresses().nextElement().isLoopbackAddress()){ 
       byte[] quads = intf.getInetAddresses().nextElement().getAddress(); 
       quads[0] = (byte)255; 
       quads[1] = (byte)255; 
       return InetAddress.getByAddress(quads); 
      } 
     }else{ 
      if(!intf.isLoopback()){ 
       List<InterfaceAddress> intfaddrs = intf.getInterfaceAddresses(); 
       return intfaddrs.get(0).getBroadcast(); //return first IP address 
      } 
     } 
    } 
    return null; 
} 
+3

這是不可能知道的廣播地址不知道子網掩碼。你的實現天真地假定一個特定的子網大小。 – Brad

2

嘗試這樣:

public static String getBroadcast(){ 
    String found_bcast_address=null; 
    System.setProperty("java.net.preferIPv4Stack", "true"); 
     try 
     { 
      Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); 
      while (niEnum.hasMoreElements()) 
      { 
      NetworkInterface ni = niEnum.nextElement(); 
      if(!ni.isLoopback()){ 
       for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) 
       { 

        found_bcast_address = interfaceAddress.getBroadcast().toString(); 
        found_bcast_address = found_bcast_address.substring(1); 

       } 
      } 
      } 
     } 
     catch (SocketException e) 
     { 
      e.printStackTrace(); 
     } 

     return found_bcast_address; 
}