QQWry.dat可以从网上下载, google下载,这个里面的IP,5天更新一次,算是比较准的了,推荐大家使用。
我们要想更新的话,只要下载最新的dat文件,覆盖原来的即可。
设置QQWry.dat路径的方法
static
string
ipdata
=
"
~/Data/System/IP/QQWry.dat
"
;
new
IPScanner().DataPath
=
System.Web.HttpContext.Current.Server.MapPath(ipdata);
操作QQWry.dat文件的类:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/*
*****************************************************************
** File Name:IPScanner.cs
** Copyright (c) 2004-2005 PPTech Studio(PPTech.Net)
** Creater:Rexsp(MSN:yubo@x263.net)
** Create Date:2004-12-27 20:10:28
** Modifier:
** Modify Date:
** Description:to scan the ip location from qqwry.dat
** Version: IPScanner 1.0.0
***************************************************************** */
using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
namespace PPTech.ESP.Component
{
/// <summary>
/// to scan the ip location from qqwry.dat
/// </summary>
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 ;
#endregion
#region 构造函数
public IPScanner()
{
//
// 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
#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
#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
#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
#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
#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
#region 获取IP地址
public string IPLocation()
{
this .QQwry();
return this .country;
}
public string IPLocaiontDetail()
{
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
}
}
** File Name:IPScanner.cs
** Copyright (c) 2004-2005 PPTech Studio(PPTech.Net)
** Creater:Rexsp(MSN:yubo@x263.net)
** Create Date:2004-12-27 20:10:28
** Modifier:
** Modify Date:
** Description:to scan the ip location from qqwry.dat
** Version: IPScanner 1.0.0
***************************************************************** */
using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
namespace PPTech.ESP.Component
{
/// <summary>
/// to scan the ip location from qqwry.dat
/// </summary>
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 ;
#endregion
#region 构造函数
public IPScanner()
{
//
// 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
#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
#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
#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
#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
#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
#region 获取IP地址
public string IPLocation()
{
this .QQwry();
return this .country;
}
public string IPLocaiontDetail()
{
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
}
}