| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Text;
 
- using System.Text.RegularExpressions;
 
- using System.IO;
 
- using System.Web;
 
- namespace CP.Common
 
- {
 
-     /// <summary>
 
-     /// 纯真ip查询类
 
-     /// 来自互联网
 
-     /// </summary>
 
-     public class IPSeek
 
-     {
 
-         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;
 
-         public IPSeek()
 
-         {
 
-         }
 
-         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; }
 
-         }
 
-         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("(我们一定要统一台湾!!!)", "");
 
-                 }
 
-                 else
 
-                 {
 
-                     nRet = 3;
 
-                     this.country = "未知";
 
-                     this.local = "";
 
-                 }
 
-                 objfs.Close();
 
-                 return nRet;
 
-             }
 
-             catch
 
-             {
 
-                 return 1;
 
-             }
 
-         }
 
-         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;
 
-         }
 
-         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;
 
-         }
 
-         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;
 
-         }
 
-         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;
 
-         }
 
-         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 " ";
 
-         }
 
-         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();
 
-         }
 
-         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;
 
-         }
 
-         /// <summary>
 
-         /// 返回城市
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public string IPCountry()
 
-         {
 
-             this.QQwry();
 
-             return this.country;
 
-         }
 
-         /// <summary>
 
-         /// 返回线路
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public string IPLocal()
 
-         {
 
-             this.QQwry();
 
-             return this.local;
 
-         }
 
-         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;
 
-         }
 
-         /// <summary>
 
-         /// 根据ip返回城市
 
-         /// </summary>
 
-         /// <param name="ip"></param>
 
-         /// <returns></returns>
 
-         public static string GetIPLocation(string ip)
 
-         {
 
-             if (string.IsNullOrEmpty(ip))
 
-                 return "";
 
-             IPSeek ipseek = new IPSeek();
 
-             string datapath = HttpContext.Current.Server.MapPath("~/Config/data/qqwry.dat");
 
-             return ipseek.IPLocation(datapath, ip);
 
-         }
 
-     }  
 
- }
 
 
  |