using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
namespace PPTech.WebSite.BusinessRules


{


/**//**//**//// <summary>

/// to scan the ip location from qqwry.dat

/// </summary>

public class IPScaner



{

//私有成员

私有成员#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;
#endregion

//构造函数

构造函数#region 构造函数
public IPScaner()


{

//

// TODO: 在此处添加构造函数逻辑

//

}

#endregion

//公共属性

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

}

#endregion

//搜索匹配数据

搜索匹配数据#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.Seek(0,SeekOrigin.Begin);

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



{

return 1;

}

}

#endregion

//IP地址转换成Int数据

IP地址转换成Int数据#region IP地址转换成Int数据

private long IpToInt(string ip)



{


char[] dot = new char[]
{'.'};

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;

}

#endregion

//int转换成IP

int转换成IP#region int转换成IP

private string IntToIP(long ip_Int)



{

long seg1=(ip_Int&0xff000000)>>24;

if(seg1<0)

seg1+=0x100;

long seg2=(ip_Int&0x00ff0000)>>16;

if(seg2<0)

seg2+=0x100;

long seg3=(ip_Int&0x0000ff00)>>8;

if(seg3<0)

seg3+=0x100;

long seg4=(ip_Int&0x000000ff);

if(seg4<0)

seg4+=0x100;

string ip=seg1.ToString()+"."+seg2.ToString()+"."+seg3.ToString()+"."+seg4.ToString();

return ip;

}

#endregion

//获取起始IP范围

获取起始IP范围#region 获取起始IP范围

private long 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;

}

#endregion

//获取结束IP

获取结束IP#region 获取结束IP

private long 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];

return this.endIp;

}

#endregion

//获取国家/区域偏移量

获取国家/区域偏移量#region 获取国家/区域偏移量

private string GetCountry()



{

switch(this.countryFlag)



{

case 1:

case 2:

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 " ";

}

#endregion

//获取国家/区域字符串

获取国家/区域字符串#region 获取国家/区域字符串

private string GetFlagStr(long offSet)



{

int flag=0;

byte [] buff = new Byte[3];

while(1==1)



{

//objfs.Seek(offSet,SeekOrigin.Begin);

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();

}

#endregion

//GetStr

GetStr#region GetStr

private string GetStr()



{

byte lowC=0;

byte upC=0;

string str="";

byte[] buff = new byte[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;

}

#endregion

// 获取IP地址

获取IP地址#region 获取IP地址

public string IPLocation()



{

this.QQwry();

return this.country+this.local;

}

public string IPLocation(string dataPath,string ip)



{

this.dataPath=dataPath;

this.ip=ip;

this.QQwry();

return this.country+this.local;

}

#endregion

}

}


使用
PPTech.WebSite.BusinessRules.IPScaner ipScaner = new IPScaner();
ipScaner.DataPath = @"F:\Test_Csharp\App_Data\QQWry.DAT";
ipScaner.IP = "220.181.29.154";

// get
ipScaner.IPLocation ()
转载于:https://www.cnblogs.com/koolay/articles/1068046.html