Android 以太网子网掩码长度 bug 修复

67 阅读1分钟

前言

这个bug说起来还是我自己搞出来的,之前每次版本迁徙都是参考修改记录同步移植以太网这块,

所以从一开始就有这个问题。

mStaticIpConfiguration.ipAddress = new LinkAddress(InetAddress.getByName(text), 24);

每次应用层设置都是固定值 24 ,导致 framework 接收到的就是错误值。正确的做法为根据设置的

子网掩码值去计算对应长度。

子网掩码长度对照表

sTm9PI.png

关于IP地址,子网掩码,子网前缀长度,路由表的的算法介绍可参考这篇

IP地址,子网掩码,子网前缀长度,路由表的的算法

解决办法

编写算法计算子网掩码长度

private int calcNetMaskInt(String netMask) {
	Log.d("cnetMask", "netMask =" + netMask);
	StringBuffer sbf;
	String str;
	int prefixLength = 0, count = 0;       
	String[] split = netMask.split("\\.");
	for (int n = 0; n < split.length; n++) {
		sbf = toBin(Integer.parseInt(split[n]));
		str = sbf.reverse().toString();
		//Log.e("net", split[n] + "===" + str);
		count = 0;
		for (int i = 0; i < str.length(); i++) {
			i = str.indexOf('1', i);  
			if (i == -1) {
				break;
			}
			count++;  
		}
		prefixLength += count;
	}
	Log.e("cnetMask", "netMask prefixLength=" + prefixLength);
	return prefixLength;
}

参考

java实现子网掩码转换为网络标识位