C#判断IP是否是指定范围内的IP

34 篇文章 0 订阅

	//webconfig
	<add key="IPRange" value="0.0.0.0-0.0.0.0"/>
	<!--<add key="IPRange" value="startIP-endIP"/>-->

	//定义允许的IP端,格式如 :static string[] IPRange= { "0.0.0.0-0.0.0.0", "0.0.0.0-0.0.0.0", "192.168.0.0-192.168.255.255" };

	//主函数,调用判断接口
        static void Main()
        { 
	//判断192.168.100.0这个ip是否在指定的IP范围段内
	string ip = GetIP();
	string IPRange = System.Configuration.ConfigurationManager.AppSettings["IPRange"].ToString();
            if (IPRange != "startIP-endIP")
            {
                bool power = false;
                if (IPRange.IndexOf(',') > 0)
                {
                    string[] AllowIPRanges = IPRange.Split(',');
                    power = TheIpIsRange(ip, AllowIPRanges);
                }
                else
                {
                    power = TheIpIsRange(ip, IPRange);
                }
                if (power == false)
                    Response.Redirect("error.htm");
            }
}
 
        /// <summary> 
        /// 获取当前请求的IP地址 
        /// </summary> 
        /// <returns></returns> 
        public static string GetIP()
        {
            //获取IP地址 
            HttpRequest request = HttpContext.Current.Request;
            string ipAddress = string.Empty;
            if (request.ServerVariables["HTTP_X_FORWARDED_FOR"] == null || request.ServerVariables["HTTP_X_FORWARDED_FOR"] == "")
            {
                ipAddress = request.ServerVariables["REMOTE_ADDR"];
            }
            else if (request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(",") >= 0)
            {
                int index = request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(",");
                ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Substring(0, index - 1);
            }
            else if (request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(";") >= 0)
            {
                int index = request.ServerVariables["HTTP_X_FORWARDED_FOR"].IndexOf(";");
                ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Substring(0, index - 1);
            }
            else
            {
                ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            }
            if (ipAddress == "127.0.0.1")
            {
                ipAddress = GetLocalhostIPAddress();
            }
            return ipAddress;
        }

        /// <summary> 
        /// 获取本机IP 
        /// </summary> 
        /// <returns></returns> 
        private static string GetLocalhostIPAddress()
        {
            string hostName = System.Net.Dns.GetHostName();
            System.Net.IPHostEntry hostInfo = System.Net.Dns.GetHostByName(hostName);
            System.Net.IPAddress[] IpAddr = hostInfo.AddressList;
            string localIP = string.Empty;
            for (int i = 0; i < IpAddr.Length; i++)
            {
                localIP += IpAddr[i].ToString();
            }
            return localIP;
        } 

        //接口函数 参数分别是你要判断的IP  和 你允许的IP范围
        //(已经重载)
        //(允许同时指定多个数组)
        public static bool TheIpIsRange(string ip, params string[] ranges)
        {
            bool tmpRes = false;
            foreach (var item in ranges)
            {
                if (TheIpIsRange(ip, item))
                {
                    tmpRes = true; break;
                }
            }
            return tmpRes;
        }

        /// <summary>
        /// 判断指定的IP是否在指定的IP范围内   这里只能指定一个范围
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="ranges"></param>
        /// <returns></returns>
        public static bool TheIpIsRange(string ip, string ranges)
        {
            bool result = false;
            int count;
            string start_ip, end_ip;
            //检测指定的IP范围 是否合法
            TryParseRanges(ranges, out count, out start_ip, out end_ip);//检测ip范围格式是否有效
            if (ip == "::1") ip = "127.0.0.1";
            try
            {
                IPAddress.Parse(ip);//判断指定要判断的IP是否合法
            }
            catch (Exception)
            {
                throw new ApplicationException("要检测的IP地址无效");
            }
            if (count == 1 && ip == start_ip) result = true;//如果指定的IP范围就是一个IP,那么直接匹配看是否相等
            else if (count == 2)//如果指定IP范围 是一个起始IP范围区间
            {
                byte[] start_ip_array = Get4Byte(start_ip);//将点分十进制 转换成 4个元素的字节数组
                byte[] end_ip_array = Get4Byte(end_ip);
                byte[] ip_array = Get4Byte(ip);
                bool tmpRes = true;
                for (int i = 0; i < 4; i++)
                {
                    //从左到右 依次比较 对应位置的 值的大小  ,一旦检测到不在对应的范围 那么说明IP不在指定的范围内 并将终止循环
                    if (ip_array[i] > end_ip_array[i] || ip_array[i] < start_ip_array[i])
                    {
                        tmpRes = false; break;
                    }
                }
                result = tmpRes;
            }
            return result;
        }

        //尝试解析IP范围  并获取闭区间的 起始IP   (包含)
        private static void TryParseRanges(string ranges, out int count, out string start_ip, out string end_ip)
        {
            string[] _r = ranges.Split('-');
            if (!(_r.Count() == 2 || _r.Count() == 1))
                throw new ApplicationException("IP范围指定格式不正确,可以指定一个IP,如果是一个范围请用“-”分隔");
            count = _r.Count();
            start_ip = _r[0];
            end_ip = "";
            try
            {
                IPAddress.Parse(_r[0]);
            }
            catch (Exception)
            {
                throw new ApplicationException("IP地址无效");
            }
            if (_r.Count() == 2)
            {
                end_ip = _r[1];
                try
                {
                    IPAddress.Parse(_r[1]);
                }
                catch (Exception)
                {
                    throw new ApplicationException("IP地址无效");
                }
            }
        }

        /// <summary>
        /// 将IP四组值 转换成byte型
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        static byte[] Get4Byte(string ip)
        {
            string[] _i = ip.Split('.');
            List<byte> res = new List<byte>();
            foreach (var item in _i)
            {
                res.Add(Convert.ToByte(item));
            }
            return res.ToArray();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值