ASP.NET implements the method of obtaining provincial and municipal address according to IP

  • 2021-01-25 07:25:51
  • OfStack

This article describes the example of ASP.NET to achieve according to IP access to provincial and municipal address method, to share with you for your reference. The specific implementation method is as follows:

1, under the site with path. Add QQWry dat (click here to this site to download https: / / www ofstack. com softs / 10529 html) file, the file is IP database files

2. Add the following class IPScanner

public class IPScanner
{
        // Private members #region Private members
        private string dataPath;
        private string ip;
        private string country;
        private string local;         private long firstStartIp = 0;
        private long lastStartIp = 0;
        private FileStream objfs = null;
        private long startIp = 0;
        private long endIp = 0;
        private int countryFlag = 0;
        private long endIpOff = 0;
        private string errMsg = null;
        // The constructor #region The constructor
        public IPScanner()
        {
            this.dataPath = System.Web.HttpContext.Current.Server.MapPath("/ipdata/QQWry.dat");
        }         // Public attribute #region Public attribute
        public string DataPath
        {
            set { dataPath = value; }
        }
        public string IP
        {
            set { ip = value; }
        }
        public string Country
        {
            get { return country; }
        }
        public string Local
        {
            get { return local; }
        }
        public string ErrMsg
        {
            get { return errMsg; }
        }         // Search for matching data #region Search for matching data
        private int QQwry()
        {
            string pattern = @"(((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))";
            Regex objRe = new Regex(pattern);
            Match objMa = objRe.Match(ip);
            if (!objMa.Success)
            {
                this.errMsg = "IP Invalid format ";
                return 4;
            }             long ip_Int = this.IpToInt(ip);
            int nRet = 0;
            if (ip_Int >= IpToInt("127.0.0.0") && ip_Int <= IpToInt("127.255.255.255"))
            {
                this.country = " Local internal loop back address ";
                this.local = "";
                nRet = 1;
            }
            else if ((ip_Int >= IpToInt("0.0.0.0") && ip_Int <= IpToInt("2.255.255.255")) || (ip_Int >= IpToInt("64.0.0.0") && ip_Int <= IpToInt("126.255.255.255")) || (ip_Int >= IpToInt("58.0.0.0") && ip_Int <= IpToInt("60.255.255.255")))
            {
                this.country = " Network reserved address ";
                this.local = "";
                nRet = 1;
            }
            objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
            try
            {
                objfs.Position = 0;
                byte[] buff = new Byte[8];
                objfs.Read(buff, 0, 8);
                firstStartIp = buff[0] + buff[1] * 256 + buff[2] * 256 * 256 + buff[3] * 256 * 256 * 256;
                lastStartIp = buff[4] * 1 + buff[5] * 256 + buff[6] * 256 * 256 + buff[7] * 256 * 256 * 256;
                long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0);
                if (recordCount <= 1)
                {
                    country = "FileDataError";
                    objfs.Close();
                    return 2;
                }
                long rangE = recordCount;
                long rangB = 0;
                long recNO = 0;
                while (rangB < rangE - 1)
                {
                    recNO = (rangE + rangB) /2;
                    this.GetStartIp(recNO);
                    if (ip_Int ==this.startIp)
                    {
                        rangB = recNO;
                        break;
                    }if (ip_Int >this.startIp)
                        rangB = recNO;
                    else
                        rangE = recNO;
                }this.GetStartIp(rangB);
                this.GetEndIp();
                if (this.startIp <= ip_Int &&this.endIp >= ip_Int)
                {
                    this.GetCountry();
                    this.local =this.local.Replace(" (we 1 We must liberate Taiwan!! ", "");
                }else{
                    nRet =3;
                    this.country =" The unknown ";
                    this.local ="";
                }
                objfs.Close();
                return nRet;
            }catch{
                return1;
            }
        }// IP Address translation Int data #region IP Address translation Int data privatelong IpToInt(string ip)
        {
            char[] dot =newchar[] { '.' };
            string[] ipArr = ip.Split(dot);
            if (ipArr.Length ==3)
                ip = ip +".0";
            ipArr = ip.Split(dot);             long ip_Int =0;
            long p1 =long.Parse(ipArr[0]) *256*256*256;
            long p2 =long.Parse(ipArr[1]) *256*256;
            long p3 =long.Parse(ipArr[2]) *256;
            long p4 =long.Parse(ipArr[3]);
            ip_Int = p1 + p2 + p3 + p4;
            return ip_Int;
        }// Get start IP The scope of #region Get start IP The scope of privatelong GetStartIp(long recNO)
        {
            long offSet = firstStartIp + recNO *7;
            //objfs.Seek(offSet,SeekOrigin.Begin);             objfs.Position = offSet;
            byte[] buff =new Byte[7];
            objfs.Read(buff, 0, 7);             endIpOff = Convert.ToInt64(buff[4].ToString()) + Convert.ToInt64(buff[5].ToString()) *256+ Convert.ToInt64(buff[6].ToString()) *256*256;
            startIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) *256+ Convert.ToInt64(buff[2].ToString()) *256*256+ Convert.ToInt64(buff[3].ToString()) *256*256*256;
            return startIp;
        }// To get over IP#region To get over IP privatelong GetEndIp()
        {
            //objfs.Seek(endIpOff,SeekOrigin.Begin);             objfs.Position = endIpOff;
            byte[] buff =new Byte[5];
            objfs.Read(buff, 0, 5);
            this.endIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) *256+ Convert.ToInt64(buff[2].ToString()) *256*256+ Convert.ToInt64(buff[3].ToString()) *256*256*256;
            this.countryFlag = buff[4];
            returnthis.endIp;
        }// Access to national / Zone offset #region Access to national / Zone offset privatestring GetCountry()
        {
            switch (this.countryFlag)
            {
                case1:
                case2:
                    this.country = GetFlagStr(this.endIpOff +4);
                    this.local = (1==this.countryFlag) ?"" : this.GetFlagStr(this.endIpOff +8);
                    break;
                default:
                    this.country =this.GetFlagStr(this.endIpOff +4);
                    this.local =this.GetFlagStr(objfs.Position);
                    break;
            }return"";
        }// Access to national / Region string #region Access to national / Region string privatestring GetFlagStr(long offSet)
        {
            int flag =0;
            byte[] buff =new Byte[3];
            while (1==1)
            {
                objfs.Position = offSet;
                flag = objfs.ReadByte();
                if (flag ==1|| flag ==2)
                {
                    objfs.Read(buff, 0, 3);
                    if (flag ==2)
                    {
                        this.countryFlag =2;
                        this.endIpOff = offSet -4;
                    }
                    offSet = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) *256+ Convert.ToInt64(buff[2].ToString()) *256*256;
                }else{
                    break;
                }
            }if (offSet <12)
                return"";
            objfs.Position = offSet;
            return GetStr();
        }//GetStr#region GetStr privatestring GetStr()
        {
            byte lowC =0;
            byte upC =0;
            string str ="";
            byte[] buff =newbyte[2];
            while (1==1)
            {
                lowC = (Byte)objfs.ReadByte();
                if (lowC ==0)
                    break;
                if (lowC >127)
                {
                    upC = (byte)objfs.ReadByte();
                    buff[0] = lowC;
                    buff[1] = upC;
                    System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
                    str += enc.GetString(buff);
                }else{
                    str += (char)lowC;
                }
            }return str;
        }publicstring IPLocation(string ip)
        {
            this.ip = ip;
            this.QQwry();
            if (this.country.Trim().Contains(this.local.Trim()))
                returnthis.country.Trim();
            returnthis.country.Trim() +this.local.Trim();
        }
}

3, ASP.NET calls to get province/city address according to IP

string ip="123.81.176.99";
IPScanner ipscaner = new IPScanner();
ipscaner.IPLocation(ip); 
string strIPAddress=ipscaner.Country;

I hope this article is helpful to your C# programming.


Related articles: