通过读取QQ ip纯真dat数据文件,得到ip所在地

/****************************************************************** 

** File Name:IPScaner.cs 

** Create Date:2004-12-27 20:10:28 

** Modifier: 

** Modify Date: 

** Description:to scan the ip location from qqwry.dat 

** Version: IPScaner 1.0.0 

******************************************************************/

using System;

using System.IO;

using System.Collections;

using System.Text;

using System.Text.RegularExpressions;

namespace UQBuy.Comm

{

    /**/

    /// <summary> 

    /// to scan the ip location from qqwry.dat 

    /// </summary> 

    public class IPScaner

    {

        #region 私?有D成é员±

        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;

        #endregion



        #region 构1造ì函ˉ数y

        public IPScaner()

        {

            // 

            // TODO: 在ú此?处|添í加ó构1造ì函ˉ数y逻?辑- 

            // 

        }

        #endregion



        #region 公?共2属?性?

        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; }

        }

        #endregion



        #region 搜?索÷匹¥配?数y据Y

        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格?式?错í误ó";

            //    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 = "本?机ú内ú部?环·回?地?址·";

                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 = "网?络?保£留?地?址·";

                this.local = "";

                nRet = 1;

            }

            objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);

            try

            {

                //objfs.Seek(0,SeekOrigin.Begin); 

                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("(¨我ò们?一?定¨要a解a放?台¨湾?!?!?!?)?", "");

                }

                else

                {

                    nRet = 3;

                    this.country = "未′知a";

                    this.local = "";

                }

                objfs.Close();

                return nRet;

            }

            catch

            {

                return 1;

            }



        }

        #endregion



        #region IP地?址·转a换?成éInt数y据Y

        private long IpToInt(string ip)

        {

            char[] dot = new char[] { '.' };

            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;

        }

        #endregion



        #region int转a换?成éIP

        private string IntToIP(long ip_Int)

        {

            long seg1 = (ip_Int & 0xff000000) >> 24;

            if (seg1 < 0)

                seg1 += 0x100;

            long seg2 = (ip_Int & 0x00ff0000) >> 16;

            if (seg2 < 0)

                seg2 += 0x100;

            long seg3 = (ip_Int & 0x0000ff00) >> 8;

            if (seg3 < 0)

                seg3 += 0x100;

            long seg4 = (ip_Int & 0x000000ff);

            if (seg4 < 0)

                seg4 += 0x100;

            string ip = seg1.ToString() + "." + seg2.ToString() + "." + seg3.ToString() + "." + seg4.ToString();



            return ip;

        }

        #endregion



        #region 获?取?起e始?IP范?围§

        private long 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;

        }

        #endregion



        #region 获?取?结á束?IP

        private long 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];

            return this.endIp;

        }

        #endregion



        #region 获?取?国ú家ò/区?域ò偏?移?量?

        private string GetCountry()

        {

            switch (this.countryFlag)

            {

                case 1:

                case 2:

                    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 " ";

        }

        #endregion



        #region 获?取?国ú家ò/区?域ò字?符?串?

        private string GetFlagStr(long offSet)

        {

            int flag = 0;

            byte[] buff = new Byte[3];

            while (1 == 1)

            {

                //objfs.Seek(offSet,SeekOrigin.Begin); 

                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();

        }

        #endregion



        #region GetStr

        private string GetStr()

        {

            byte lowC = 0;

            byte upC = 0;

            string str = "";

            byte[] buff = new byte[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;

        }

        #endregion



        #region 获?取?IP地?址·

        public string IPLocation()

        {

            this.QQwry();

            return this.country + this.local;

        }

        public string IPLocation(string dataPath, string ip)

        {

            this.dataPath = dataPath;

            this.ip = ip;

            this.QQwry();

            return this.country + this.local;

        }

        #endregion

        //  #region 测a试?地?址·搜?索÷,代ú码?

        //IPScaner objScan = new IPScaner();

        //string ip = "61.147.124.177";

        //objScan.DataPath = @"E:/qqwry.dat";//数y据Y库a文?件t,?我ò已?经-将?其?放?在úReferanceDLL文?件t夹D下?。£

        //objScan.IP = ip;

        //string addre = objScan.IPLocation();

        //string err = objScan.ErrMsg;

        //Response.Write(addre+"<br/>" +err );

        //#endregion



    }

}

你可能感兴趣的:(数据文件)