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

来源:互联网 发布:c语言goto怎么用 编辑:程序博客网 时间:2024/06/03 20:14

直接上代码:


此方法对于掩码为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;}


原创粉丝点击