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

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

  1、在网站的跟路径下面添加QQWry.dat(点击此处本站下载http://www.glzy8.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#程序设计有所帮助。