ASP.NET实现根据IP获取省市地址的方法

本文实例讲述了ASP.NET实现根据IP获取省市地址的方法,分享给大家供大家参考。具体实现方法如下:

1、在网站的跟路径下面添加QQWry.dat(点击此处本站下载https://www.nhooo.com/softs/10529.html)文件,这个文件是IP数据库文件

2、添加以下一个类 IPScanner

public class IPScanner

{

        //私有成员#region 私有成员 

        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;

        //构造函数#region 构造函数         public IPScanner()         {             this.dataPath = System.Web.HttpContext.Current.Server.MapPath("/ipdata/QQWry.dat");         }

        //公共属性#region 公共属性         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; }         }

        //搜索匹配数据#region 搜索匹配数据         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.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{                 return1;             }         }// IP地址转换成Int数据#region IP地址转换成Int数据 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;         }//获取起始IP范围#region 获取起始IP范围 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;         }// 获取结束IP#region 获取结束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;         }//获取国家/区域偏移量#region 获取国家/区域偏移量 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"";         }//获取国家/区域字符串#region 获取国家/区域字符串 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根据IP获取省市地址的调用

string ip="123.81.176.99";

IPScanner ipscaner = new IPScanner();

ipscaner.IPLocation(ip);  

string strIPAddress=ipscaner.Country;

希望本文所述对大家的C#程序设计有所帮助。