根据IP和子网掩码,判断ip是否属于子网

直接上代码:


此方法对于掩码为31、32不生效。掩码为31、32的可以特殊指定子网IP


	private boolean validSingleSubnetMask(String subnetMask, String ip) {
		logger.info("开始校验ip是否属于子网。ip:{},子网:{}", ip, subnetMask);
		boolean flag = false;
		
		String[] subnetMasks = subnetMask.split("/");
		String[] subnetIp = subnetMasks[0].split("\\.");
		String[] validIp = ip.split("\\.");
		Integer hostIpMask = Integer.parseInt(subnetMasks[1]);
		Integer remainder = hostIpMask % 8;
		Integer ipIndexRange = remainder == 0 ? 256 : 256 >> remainder;//ip子网在第几个地址允许的长度
		
		for (int i = 1; i <= 4; i++) {//通过子网掩码长度,判断ip从什么地方开始需要校验
			if (i * 8 > hostIpMask) {
				Integer subnetIpValue = Integer.parseInt(subnetIp[i-1]);
				Integer validIpIndex = Integer.parseInt(validIp[i-1]);
				for (int j = 0; j < (256/ipIndexRange); j++) {
					if (subnetIpValue >= ipIndexRange * j && subnetIpValue < ipIndexRange * (j + 1)) {
						logger.info("子网:"+subnetMask+" 子网允许的ip为:"+ ipIndexRange * j + "到:" + ipIndexRange * (j + 1));
						
						if (validIpIndex > ipIndexRange * j && validIpIndex <= ipIndexRange * (j + 1) - 2) {
							logger.info("ip{}属于子网{}", ip, subnetMask);
							flag = true;
							break;
						} else {
							logger.info("ip{}不属于子网{}", ip, subnetMask);
						}
					}
				}
				break;
			} else {
				if (!validIp[i-1].equals(subnetIp[i-1])) {//前面ip开头不同,校验不通过
					logger.info("ip{}不属于子网{}", ip, subnetMask);
					break;
				}
			}
		}
		return flag;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值