本文实例讲述了ASP.NET实现根据IP获取省市地址的方法,分享给大家供大家参考。具体实现方法如下:
1、在网站的跟路径下面添加QQWry.dat(点击此处本站下载https://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})|(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#程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 罗大佑1982《之乎者也》无法盗版的青春套装版 [WAV+CUE][1G]
- 曾庆瑜1989-款款柔情[日本东芝版][WAV+CUE]
- Scelsi-IntegraledesquatuorsacordesetTrioacordes-QuatuorMolinari(2024)[24bit-WAV]
- 房东的猫2017-房东的猫[科文音像][WAV+CUE]
- 杨乃文.2016-离心力(引进版)【亚神音乐】【WAV+CUE】
- 群星.2024-珠帘玉幕影视原声带【TME】【FLAC分轨】
- 芝麻龙眼.2008-光阴隧道民歌记录3CD【乡城】【WAV+CUE】
- 谭艳《再度重相逢HQII》头版限量[低速原抓WAV+CUE][549M]
- ABC唱片《蔡琴三十周年纪念版》6N纯银镀膜 [WAV+CUE][1.1G]
- 海来阿木《西楼情歌》开盘母带[WAV+CUE][1.1G]
- TheGesualdoSix-QueenofHeartsLamentsandSongsofRegretforQueensTerrestrialandCele
- 王建杰2011-荣华富贵[喜玛拉雅][WAV+CUE]
- 孙悦2024-时光音乐会[金蜂][WAV+CUE]
- 秦宇子.2020-#YUZI【海蝶】【FLAC分轨】
- 苏有朋.1994-这般发生【华纳】【WAV+CUE】