我正在寫一個android應用程序,它應該通過WiFi發送廣播數據包。從ip地址獲得廣播地址的最佳方式是什麼?
目前我可以從WifiManager.getConnectionInfo().getIpAddress()
獲得設備的IP地址,並通過用0替換最後一位數字來猜測廣播地址。但我真的不喜歡這種解決方案。
什麼是正確的方法?
我正在寫一個android應用程序,它應該通過WiFi發送廣播數據包。從ip地址獲得廣播地址的最佳方式是什麼?
目前我可以從WifiManager.getConnectionInfo().getIpAddress()
獲得設備的IP地址,並通過用0替換最後一位數字來猜測廣播地址。但我真的不喜歡這種解決方案。
什麼是正確的方法?
您需要用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;
}
嘗試這樣:
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;
}
這是不可能知道的廣播地址不知道子網掩碼。你的實現天真地假定一個特定的子網大小。 – Brad