内外网判断

        /// <summary>
        /// 是否是内网
        /// </summary>
        /// <returns></returns>
        public bool IsInnerIp(string ipAddress)
        {
            /**
            私有IP:A类 10.0.0.0-10.255.255.255
            B类 172.16.0.0-172.31.255.255
            C类 192.168.0.0-192.168.255.255
            当然,还有127这个网段是环回地址 
            **/
            ipAddress = GetHostByName(ipAddress);
            long ipNum = GetIpNum(ipAddress);
            long aBegin = GetIpNum("10.0.0.0");
            long aEnd = GetIpNum("10.255.255.255");
            long bBegin = GetIpNum("172.16.0.0");
            long bEnd = GetIpNum("172.31.255.255");
            long cBegin = GetIpNum("192.168.0.0");
            long cEnd = GetIpNum("192.168.255.255");
            bool isInnerIp = IsInner(ipNum, aBegin, aEnd) || IsInner(ipNum, bBegin, bEnd) || IsInner(ipNum, cBegin, cEnd) || ipAddress.Equals("127.0.0.1");
            return isInnerIp;
        }

        /// <summary>
        /// 域名解析IP
        /// </summary>
        /// <param name="hostname"></param>
        /// <returns></returns>
        private string GetHostByName(string hostname)
        {
            IPAddress ip;
            if (IPAddress.TryParse(hostname, out ip))
            {
                return ip.ToString();
            }
            else
            {
                if (hostname == "localhost") return "127.0.0.1";

return Dns.GetHostAddresses(hostname).Where(p =>
p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).FirstOrDefault().ToString();


            }
        }

        /// <summary>
        /// 把IP地址转换为Long型数字
        /// </summary>
        /// <param name="ipAddress">IP地址字符串</param>
        /// <returns></returns>
        private long GetIpNum(String ipAddress)
        {
            String[] ip = ipAddress.Split('.');
            long a = int.Parse(ip[0]);
            long b = int.Parse(ip[1]);
            long c = int.Parse(ip[2]);
            long d = int.Parse(ip[3]);

            long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
            return ipNum;
        }
        /// <summary>
        /// 判断用户IP地址转换为Long型后是否在内网IP地址所在范围
        /// </summary>
        /// <param name="userIp"></param>
        /// <param name="begin"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private bool IsInner(long userIp, long begin, long end)
        {
            return (userIp >= begin) && (userIp <= end);
        }

 

IsInnerIp(string ipAddress)中传入的地址应该就是网页访问的地址,用dns.GetHostAddresses应该就不好了
posted @ 2016-12-06 17:44  江境纣州  阅读(40)  评论(0)    收藏  举报