我需要在 Android 设备上检测 WiFi 网络上的本地 IP 地址和子网掩码(以便严格为本地子网正确计算 UDP 广播地址)。
当设备连接到接入点时,以下各项正常工作:
// Only works when NOT tethering
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
if (dhcp == null)
throw new IOException("No DHCPInfo on WiFi side.");
foo(dhcp.ipAddress, dhcp.netmask);
但是当它是通过网络共享提供接入点的 android 设备时它不起作用:当 Android 设备是它的客户端时,DhcpInfo 似乎包含 DCHP 服务器设置的信息,而不是当它是 Android 设备本身提供 DHCP 服务时。在网络共享中,我能找到的最有希望的解决方案是:
// No way to get subnet mask
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
if (info == null)
throw new IOException("No connection info on WiFi side.");
foo(info.getIpAddress(), info.??? /* netmask*/ );
编辑:错误,在我的测试中,即使这仅在不绑定时才有效。绑定 IP 时始终为 0。
但是没有什么像WifiInfo.getNetMask()
,在这种情况下我怎样才能获得子网掩码?(这种缺席让我觉得很奇怪,因为那里有大量其他信息。我是否遗漏了一些明显的东西?)
此外,理想情况下,我想要一个不需要区分 Android 设备是否提供网络共享的解决方案,并且只需在 WiFi 网络上获取本地 IP 地址和子网掩码,无论如何,当 Android 设备是接入点的提供者或客户端。
即使是标准的 Java(即不是特定于 Android 的)NetworkInterface.getNetworkInterfaces()
,似乎也没有办法获取子网掩码(除了不允许区分哪个对应于 WiFi)。我错过了什么?