用QQWry.Dat作数据源实现IP地址检索[C#]

转载 2007年10月12日 23:52:00
前几天有一个朋友说一直想有一个这样程序,可以把网络上比较流行的QQwry.Dat作为IP数据源来实现IP地址的查询显示。可是网络上一直没 有出现.Net的版本。我想既然如此,那我就抽空写一写好了,先到Google上Go了一下,找到相关介绍文章,了解了其格式,然后又参考了其它语言版本 的程序,一天多一点时间,终于把这个东西写好了。不敢独享,帖出来 /**//******************************************************************
** File Name:IPScaner.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: IPScaner 1.0.0
******************************************************************/
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数据#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#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范围#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#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#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地址#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


}
}

调用方式:
测试地址搜索#region 测试地址搜索
IPScaner objScan = new IPScaner();
string ip="221.224.205.13";
objScan.DataPath=@"E:/个人资料/IMTools/QQwryUpdate/QQWry.Dat";
objScan.IP=ip;
string addre=objScan.IPLocation();
string err=objScan.ErrMsg;

#endregion

ASP.NET(C#)利用QQ的IP数据库QQWry.Dat进行精确IP查询

  先下载最新的IP数据库QQWry.Dat 到http://www.cz88.net/这个里的右上角下载最新版本的纯真IP数据库添加下面这个类/***************************...
  • kongwei521
  • kongwei521
  • 2008-03-01 16:04:00
  • 5349

[C#源码]IP 地址扫描器(使用 QQWry.dat IP 地址库)

  • 2012年07月05日 13:46
  • 1.86MB
  • 下载

C#读取QQWry.Dat文件实现IP查询

QQWry数据库下载地址:http://download.csdn.net/detail/fwj380891124/4385554using System; using System.Collect...
  • fwj380891124
  • fwj380891124
  • 2012-06-21 12:25:20
  • 1969

通过IP地址获取城市 QQWry.Dat

通过IP地址获取城市 QQWry.Datnamespace Common { /// ///IPScanner 的摘要说明 /// public clas...
  • livening
  • livening
  • 2010-10-08 14:08:00
  • 2883

java读取纯真IP数据库qqwry.dat的源代码

java读取纯真IP数据库QQwry.dat的源代码,要运行此程序必须有到网上下载QQwry.dat,下载地址 http://www.cz88.net/down/   由于太大,我这里就不提供了。 ...
  • syc001
  • syc001
  • 2017-06-02 10:10:08
  • 3899

php通過利用QQWry.Dat 实现 IP 地址高效检索

/*** @author 马秉尧*/class IpLocation {/*** QQWry.Dat文件指针* @var resource*/var $fp;/*** 第一条IP记录的偏移地址** @...
  • caaclxf
  • caaclxf
  • 2005-09-15 22:22:00
  • 1202

【java】java获取ip地址(读取QQWry.dat文件形式)

该工具类以读取本地纯真IP地址库实现,缺点不易更新 IPSeekerUtil.java 工具类 package com.gfan.yyq.yyqs.utils; import java....
  • yjqyyjw
  • yjqyyjw
  • 2016-03-31 16:09:37
  • 1074

纯真IP数据库QQWry.dat格式详解

自从有了IP数据库这种东西,QQ外挂的显示IP功能也随之而生,本人见识颇窄,是否还有其他应用不得而知,不过,IP数据库确实是个不错的东西。如今网络上最流行的IP数据库我想应该是纯真版的(说错了也不要扁...
  • hearain528
  • hearain528
  • 2016-01-12 15:07:16
  • 4906

C#写的IP地址和手机归属地查询程序

  • 2008年09月19日 11:54
  • 2.19MB
  • 下载

纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)

转载自:http://blog.cafeboy.org/2011/02/25/qqwry-to-ipwry/ ipwry.dat相比qqwry.dat占用空间更小,我们可以将纯真IP数据库(qqw...
  • lgh1992314
  • lgh1992314
  • 2013-11-16 17:39:55
  • 3172
收藏助手
不良信息举报
您举报文章:用QQWry.Dat作数据源实现IP地址检索[C#]
举报原因:
原因补充:

(最多只允许输入30个字)