子网掩码随笔

前段时间做了个公司内部项目,需要根据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!

猜你喜欢

转载自www.cnblogs.com/LukeSteven/p/12982204.html