安卓获取子网掩码(Mask)

您所在的位置:网站首页 电脑怎么查子网掩码 安卓获取子网掩码(Mask)

安卓获取子网掩码(Mask)

2024-07-13 04:34| 来源: 网络整理| 查看: 265

百度大法搜的获取网络配置(包括子网掩码)的方法基本都是拿wifimanager的dhcpinfo获取网络信息。

这个方法获取到的其他信息都没问题,唯独子网掩码获取到的要么就是错的,要么就是0.0.0.0

有问题的获取方式如下:

public static String getNetMask(Context context){ DhcpInfo dhcpInfo = ((WifiManager) context .getSystemService(Context.WIFI_SERVICE)).getDhcpInfo(); return formatIpAddress(dhcpInfo.netmask); } private static String formatIpAddress(int ipAdress) { return (ipAdress & 0xFF ) + "." + ((ipAdress >> 8 ) & 0xFF) + "." + ((ipAdress >> 16 ) & 0xFF) + "." + ( ipAdress >> 24 & 0xFF) ; }

我使用此方式获取的子网掩码大多数是0.0.0.0,偶尔是255.0.0.0,但真实的子网掩码是255.255.252.0

参考终于取到了Android的子网掩码 - 简书 (jianshu.com)的方法

使用ifconfig并解析的方式获取子网掩码,但是参考链接里没有做出网卡区分,在此对这个方法做一定的修改

针对的默认ifconfig的打印如下:

wlan0 Link encap:Ethernet HWaddr 44:01:bb:4e:0d:8a Driver rtl8723du UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:19568 errors:0 dropped:36 overruns:0 frame:0 TX packets:6412 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2554230 TX bytes:3465241 p2p0 Link encap:Ethernet HWaddr 46:01:bb:4e:0d:8a Driver rtl8723du UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 TX bytes:0 eth0 Link encap:Ethernet HWaddr bc:26:1d:04:4a:f9 inet addr:192.168.50.6 Bcast:192.168.50.255 Mask:255.255.255.0 inet6 addr: fe80::6de2:eac1:c614:5ccb/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:224 errors:0 dropped:0 overruns:0 frame:0 TX packets:6665 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:29352 TX bytes:2200704 Interrupt:41 Base address:0x4000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope: Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:255 errors:0 dropped:0 overruns:0 frame:0 TX packets:255 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:18156 TX bytes:18156

分别作了获取默认的wlan0的子网掩码和获取eth0的子网掩码,代码如下:

private static final String defaultIP = "0.0.0.0"; private static final String command = "ifconfig"; public static String getWlan0Mask() { String TAG = "lanky"; String Mask = defaultIP; try { Process process = Runtime.getRuntime().exec(new String[]{command}); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); do { String line = bufferedReader.readLine(); if (line == null) { Log.d(TAG, "test: line is null"); break; } if (line.startsWith("wlan0 ")) { Mask = defaultIP; } Mask = getLineMask(line).equals("") ?Mask:getLineMask(line); if (line.startsWith("p2p0 ")) { break; } } while (true); } catch (IOException e) { e.printStackTrace(); } return Mask; } public static String getEth0Mask() { String TAG = "lanky"; String Mask = defaultIP; try { Process process = Runtime.getRuntime().exec(new String[]{command}); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); do { String line = bufferedReader.readLine(); if (line == null) { Log.d(TAG, "test: line is null"); break; } if (line.startsWith("eth0 ")) { Mask = defaultIP; } Mask = getLineMask(line).equals("") ?Mask:getLineMask(line); if (line.startsWith("lo ")) { break; } } while (true); } catch (IOException e) { e.printStackTrace(); } return Mask; } private static String getLineMask(String line){ String TAG = "mask"; String IP = ""; if (line.trim().matches("inet addr:(\\d{1,3}\\.){3}\\d{1,3}( ){2}" + "(Bcast:(\\d{1,3}\\.){3}\\d{1,3}( ){2}){0,1}" + "Mask:(\\d{1,3}\\.){3}\\d{1,3}")) { String[] props = line.trim().split("( ){2}"); for (String prop : props) { if (prop.length() == 0) { continue; } String[] kv = prop.split(":"); if (kv[0].startsWith("inet addr")) { Log.d(TAG, "----ipAddr: " + kv[1]); } else if (kv[0].startsWith("Bcast")) { Log.d(TAG, "----Bcast: " + kv[1]); } else if (kv[0].startsWith("Mask")) { Log.d(TAG, "----mask: " + kv[1]); IP = kv[1]; } } } return IP; }

如果有多个网卡,要想获取别的,可以参考我这个代码,根据你自己的ifconfig的打印来修改就好了

注:需要uid.system和系统签名及权限,适合系统级应用的开发参考,比如setting、Launcher等



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3