手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >ASP.NET实现根据IP获取省市地址的方法
ASP.NET实现根据IP获取省市地址的方法
摘要:本文实例讲述了ASP.NET实现根据IP获取省市地址的方法,分享给大家供大家参考。具体实现方法如下:1、在网站的跟路径下面添加QQWry.d...

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

1、在网站的跟路径下面添加QQWry.dat(点击此处本站下载http://www.jb51.net/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})|(1d{2})|(2[0-4]d)|(25[0-5])).){3}((d{1,2})|(1d{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#程序设计有所帮助。

【ASP.NET实现根据IP获取省市地址的方法】相关文章:

介绍几个ASP.NET中容易忽略但却很重要的方法函数

ASP.NET如何获取两个日期之间的天数

ASP.NET编程中经常用到的27个函数集

ASP.NET中实现模板页

Ajax实现异步刷新验证用户名是否已存在的具体方法

ASP.NET连接MySql数据库的2个方法及示例

ASP.NET Web API实现POST报文的构造与推送

ASP.NET实现推送文件到浏览器的方法

利用Timer在ASP.NET中实现计划任务的方法

在ASP.NET中实现多文件上传的方法

精品推荐
分类导航