zoukankan      html  css  js  c++  java
  • 通过读取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
    
        }
    }
    
    联盟快卖 商人,生意人,待创业人士在此可以共赢互利 期待你的加入 群号:140809277
  • 相关阅读:
    小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-9.使用JWT生成用户Token回写客户端
    小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-8.用户模块开发之保存微信用户信息
    小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-7.授权登录获取微信用户个人信息实战
    小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-6.微信扫码登录回调本地域名映射工具Ngrock
    Vmware Briged方式使虚拟机上网
    设置VIM的配色方案
    SecureCRT辅助解决方案
    ARM标准汇编与GNU汇编
    arm:c语言和汇编混合编程
    assert()用法
  • 原文地址:https://www.cnblogs.com/yexinw/p/2108545.html
Copyright © 2011-2022 走看看