该类可以根据 IP 地址查询该 IP 地址所在的国家和地区, 使用 QQWry.dat IP 地址库数据文件.
有时做网站或者一些需要查询 IP 地址的软件可能用到.
使用 QQWry.dat 文件最大的好处就是 IP 地址库不用自己去更新, 原作者有更新我就发挥"拿来主义"就行了, HOHO~~将程序的 QQWry.dat 替换我们就马上更新 IP 地址库了, 不用修改任何一个代码.
原作者不明, 我给这代码加个了一些注释, 方便使用, 感谢原作者!
查询的时间就形如
//ip.DataPath = Server.MapPath("~/" + "qqwry.dat");
//ip.IP = TextBox1.Text;
//Label1.Text = ip.IPLocation();
//上面的方法和下面的方法都行
Label1.Text += "<br />" + ip.IPLocation(Server.MapPath("~/" + "qqwry.dat"), TextBox1.Text);
QQWry.dat 文件经常, 大家可以去下载, 免费的. 我自己也上传一个, 不知道什么时候发布, 将就用着吧^^
下载: http://www.fs2you.com/files/d5b3ceba-a096-11dc-9854-00142218fc6e/
C# CODE
/*
***************************************************************** ** File Name:IPScaner.cs ** 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
CS.Rules {
///
<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
公共属性
///
<summary>
///
IP 地址数据库文件, 如 Server.MapPath("~/" + "qqwry.dat") 表示在放在根目录下的 qqwry.dat 文件
///
</summary>
public
string
DataPath {
set
{ dataPath
=
value; } }
///
<summary>
///
查询的 IP 址
///
</summary>
public
string
IP {
set
{ ip
=
value; } }
///
<summary>
///
获取 IP 地址的城市
///
</summary>
public
string
Country {
get
{
return
country; } }
///
<summary>
///
获取 IP 址的地区
///
</summary>
public
string
Local {
get
{
return
local; } }
///
<summary>
///
错误信息
///
</summary>
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地址
///
<summary>
///
获取 IP 地址的国家和地区
///
</summary>
///
<returns>
该 IP 地址的国家和地区
</returns>
public
string
IPLocation() {
this
.QQwry();
return
this
.country
+
this
.local; }
///
<summary>
///
获取 IP 地址的国家和地区
///
</summary>
///
<param name="dataPath">
IP 地址数据库文件, 如 Server.MapPath("~/" + "qqwry.dat") 表示在放在根目录下的 qqwry.dat 文件
</param>
///
<param name="ip">
查询的 IP 址
</param>
///
<returns>
该 IP 地址的国家和地区
</returns>
public
string
IPLocation(
string
dataPath,
string
ip) {
this
.dataPath
=
dataPath;
this
.ip
=
ip;
this
.QQwry();
return
this
.country
+
this
.local; }
#endregion
} }