zoukankan      html  css  js  c++  java
  • 子网掩码随笔

    前段时间做了个公司内部项目,需要根据IP和子网计算的策略判断数据是否需要进行监控,所以马上开始了相关信息的调查。
    项目中只需判断C类IP,所以子网掩码格式也就固定在了255.255.255.xxx。

    子网掩码(二进制) 子网掩码(十进制) 掩码位 可用IP数
    11111111.11111111.11111111.00000000 255.255.255.0 24 254
    11111111.11111111.11111111.10000000 255.255.255.128 25 126
    11111111.11111111.11111111.11000000 255.255.255.192 26 62
    11111111.11111111.11111111.11100000 255.255.255.224 27 30
    11111111.11111111.11111111.11110000 255.255.255.240 28 14
    11111111.11111111.11111111.11111000 255.255.255.248 29 6
    11111111.11111111.11111111.11111100 255.255.255.252 30 2

    子网的划分是通过借用IP地址中若干位主机地址来充当子网的网络地址,从而将原网络划分为若干子网,所以只能是0,128,192,224,240,248,252,254,255。
    而通过子网的划分即可得到可用IP的范围,即计算得出的网络地址到广播地址中间的范围,这样理解可能会更容易着手开发,判断监控数据中的IP是否在划分的IP范围内即可。

    考虑到两种方案,一种是通过IPAdress,计算相同子网下两个IP的网络地址是否相同,另一种则是将网络地址和广播地址均转成long类型,得到起始、终止IP,判断监控数据中IP转long后的数字是否在两数字之间就OK了。
    记录下方案1会用到的代码,IP2long的方法就不在此记录了(可能会单独记下,哈哈哈)

        public static class IpAddressExtentions
        {
            // 获取广播地址
            public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
            {
                byte[] ipAdressBytes = address.GetAddressBytes();
                byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
    
                if (ipAdressBytes.Length != subnetMaskBytes.Length)
                    throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
    
                byte[] broadcastAddress = new byte[ipAdressBytes.Length];
                for (int i = 0; i < broadcastAddress.Length; i++)
                {
                    broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255));
                }
                return new IPAddress(broadcastAddress);
            }
    
            // 获取网络地址
            public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
            {
                byte[] ipAdressBytes = address.GetAddressBytes();
                byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
    
                if (ipAdressBytes.Length != subnetMaskBytes.Length)
                    throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
    
                byte[] broadcastAddress = new byte[ipAdressBytes.Length];
                for (int i = 0; i < broadcastAddress.Length; i++)
                {
                    broadcastAddress[i] = (byte)(ipAdressBytes[i] & (subnetMaskBytes[i]));
                }
                return new IPAddress(broadcastAddress);
            }
    
            // 判断两个IP是否在相同子网下 
            public static bool IsInSameSubnet(this IPAddress address2, IPAddress address, IPAddress subnetMask)
            {
                IPAddress network1 = address.GetNetworkAddress(subnetMask);
                IPAddress network2 = address2.GetNetworkAddress(subnetMask);
    
                return network1.Equals(network2);
            }
        }
    

    自己记录一下下,理解得可能不深刻或者有偏差,可能随着学习后面会有更好得理解吧,就这样,Time!

  • 相关阅读:
    封了1000多个IP地址段,服务器现在坚如磐石,对付几个小毛贼还是很轻松的
    这两周服务器被攻击,封锁了600多个IP地址段后今天服务器安静多了
    centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!
    JS 在页面上直接将json数据导出到excel,支持chrome,edge,IE10+,IE9,IE8,Safari,Firefox
    一个实战系统的权限架构思维推导过程
    股灾情形下搞了个满堂红,我也是醉了
    VBC#代码互转工具
    DSAPI多功能.NET函数库组件
    DS标签控件文本解析格式
    DSAPI官方QQ群
  • 原文地址:https://www.cnblogs.com/LukeSteven/p/12982204.html
Copyright © 2011-2022 走看看