安卓广播地址

8

我正在为我的安卓手机制作客户端服务器应用。

我已经使用Python创建了一个UDP服务器,它会一直监听连接请求。

我可以直接输入服务器的IP地址(例如192.168.0.100),这样就可以成功发送数据。我还可以输入广播地址(例如192.168.0.255),这样就可以在192.168.0.100上找到服务器。

有没有可能获取我所连接的安卓手机所处网络的广播地址呢?我只会在我的Wifi网络或其他Wifi网络上使用此应用程序。

谢谢!

4个回答

18

来自

http://code.google.com/p/boxeeremote/source/browse/trunk/Boxee+Remote/src/com/andrewchatham/Discoverer.java?spec=svn28&r=28

private InetAddress getBroadcastAddress() throws IOException {
    WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    DhcpInfo dhcp = wifi.getDhcpInfo();
    // handle null somehow

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++)
      quads[k] = (byte) (broadcast >> (k * 8));
    return InetAddress.getByAddress(quads);
}

这样做的好处是只考虑WIFI。我知道OP说过“我只会在我的Wifi网络或其他Wifi网络上使用此应用程序”,但值得一提的是,如果有人需要非wifi的选择,可以考虑这种方法。


还有...各位不要忘记您的清单权限!<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> - ssimm

7

这里有一个应该能够起作用的方法:

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

当IPv6也被使用时,它会抛出一个异常,因为它没有广播地址,getBroadcast()返回null,toString()抛出异常。(至少在我的Windows模拟器上是这样的。)很容易解决,只需检查interfaceAddress.getBroadcast()是否为null即可。 - Feri

0

或许有更简单的方法...

public static String getBroadcast() throws Exception {
    System.setProperty("java.net.preferIPv4Stack", "true");
    InetAddress inet = InetAddress.getLocalHost();
    NetworkInterface net = NetworkInterface.getByInetAddress(inet);
    InterfaceAddress [] interfaceAddresses = net.getInterfaceAddresses().toArray(new InterfaceAddress[0]);
    if ( interfaceAddresses.length > 0 ) {
        return interfaceAddresses[0].getBroadcast().toString().substring(1);
    } else {
        return "255.255.255";
    }
}

1
难道不应该是“255.255.255.255”吗? - clankill3r

-2

由于广播IP地址是当前IP地址,但以255结尾,因此您可以像这样操作:

public String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface
                .getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    return inetAddress.getHostAddress().toString();
                }
            }
        }
    } catch (SocketException ex) {}
    return null;
}

public static String getBroadcast() throws SocketException {
    System.setProperty("java.net.preferIPv4Stack", "true");
    for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); niEnum.hasMoreElements();) {
        NetworkInterface ni = niEnum.nextElement();
        if (!ni.isLoopback()) {
            for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
                return interfaceAddress.getBroadcast().toString().substring(1);
            }
        }
    }
    return null;
}

4
这句话的意思是,这可能会假设网络掩码为255.255.255.255,但这种假设可能并不正确。你应该获取与检索到的地址相关联的网络掩码,然后计算 bcast = ipAddress | ~netmask - hobbs
我在想,你会如何实现这样的事情呢?干杯 - RailsSon
9
广播IP地址是当前IP地址但以25结尾。不对,一个典型的家庭网络的广播地址是.255,但这并不是普遍适用的。 - Jeffrey Blattman
一个子网掩码为255.255.255.128的C类子网,其IP地址范围为192.168.0.1至192.168.0.126。该子网的广播地址为192.168.0.127。 - braden
1
谢谢,当您删除“广播IP地址是当前IP地址,但以255结尾”时,我会为您的答案点赞。 - braden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接