欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【ASP.NET实现根据IP获取省市地址的方法】,下面是详细的讲解!
ASP.NET实现根据IP获取省市地址的方法
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();
}
}
关于ASP.NET实现根据IP获取省市地址的方法的用户互动如下:
相关问题:
答: >>详细
相关问题:
答: >>详细
相关问题:
答: >>详细
- 【asp】asp.net url重写浅谈-net-url重写
- 【DataSet】DataSet、DataTable、DataRow区别详解
- 【asp】asp.net 动态添加多个用户控件-net-动态添
- 【ASP】ASP.NET中内嵌页面代码的一个问题-NET-内
- 【As】Asp.net中的页面乱码的问题-sp--pn-ne-et
- 【创建】ASP.NET Web API教程 创建域模型的方法详
- 【Asp】Asp.net 页面调用javascript变量的值-net-
- 【ASP】ASP.NET 5升级后如何删除旧版本的DNX-NET5
- 【404页面】ASP.NET设置404页面返回302HTTP状态码
- 【asp】asp.net开发中常见公共捕获异常方式总结(
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
