【问题标题】:What is the best way to get a broadcast address from an ip address?从 IP 地址获取广播地址的最佳方法是什么?
【发布时间】:2012-11-17 14:48:41
【问题描述】:

我正在编写一个应该通过 WiFi 发送广播数据包的 android 应用程序。

目前我可以从WifiManager.getConnectionInfo().getIpAddress()获取设备的IP地址,并通过简单地将最后一位数字替换为0来猜测广播地址。但我真的不喜欢这种解决方案。

正确的方法是什么?

【问题讨论】:

    标签: android wifi broadcast


    【解决方案1】:

    试试这样的:

        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;
    }
    

    【讨论】:

      【解决方案2】:

      您需要替换为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;
      }
      

      【讨论】:

      • 不知道子网掩码是不可能知道广播地址的。您的实现天真地假定了特定的子网大小。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2018-11-01
      • 2018-03-19
      相关资源
      最近更新 更多