.NET读取QQWry.Dat 纯真版ip数据库格式数据源
把网络上比较流行的纯真版ip数据库格式QQwry.Dat作为IP数据源来实现IP地址的查询显示。
调用方式:
1
/*
*****************************************************************
2 ** File Name:IPScaner.cs
3 ** Create Date:2004-12-27 20:10:28
4 ** Modifier:
5 ** Modify Date:
6 ** Description:to scan the ip location from qqwry.dat
7 ** Version: IPScaner 1.0.0
8 ***************************************************************** */
9 using System;
10 using System.IO;
11 using System.Collections;
12 using System.Text;
13 using System.Text.RegularExpressions;
14 namespace chat.Rules
15 {
16 /**/ /// <summary>
17 /// to scan the ip location from qqwry.dat
18 /// </summary>
19 public class IPScaner
20 {
21 #region 私有成员
22 private string dataPath;
23 private string ip;
24 private string country;
25 private string local;
26
27 private long firstStartIp = 0 ;
28 private long lastStartIp = 0 ;
29 private FileStream objfs = null ;
30 private long startIp = 0 ;
31 private long endIp = 0 ;
32 private int countryFlag = 0 ;
33 private long endIpOff = 0 ;
34 private string errMsg = null ;
35 #endregion
36
37 #region 构造函数
38 public IPScaner()
39 {
40 //
41 // TODO: 在此处添加构造函数逻辑
42 //
43 }
44 #endregion
45
46 #region 公共属性
47 public string DataPath
48 {
49 set {dataPath = value;}
50 }
51 public string IP
52 {
53 set {ip = value;}
54 }
55 public string Country
56 {
57 get { return country;}
58 }
59 public string Local
60 {
61 get { return local;}
62 }
63 public string ErrMsg
64 {
65 get { return errMsg;}
66 }
67 #endregion
68
69 #region 搜索匹配数据
70 private int QQwry()
71 {
72 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])) " ;
73 Regex objRe = new Regex(pattern);
74 Match objMa = objRe.Match(ip);
75 if ( ! objMa.Success)
76 {
77 this .errMsg = " IP格式错误 " ;
78 return 4 ;
79 }
80
81 long ip_Int = this .IpToInt(ip);
82 int nRet = 0 ;
83 if (ip_Int >= IpToInt( " 127.0.0.0 " ) && ip_Int <= IpToInt( " 127.255.255.255 " ))
84 {
85 this .country = " 本机内部环回地址 " ;
86 this .local = "" ;
87 nRet = 1 ;
88 }
89 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 " )))
90 {
91 this .country = " 网络保留地址 " ;
92 this .local = "" ;
93 nRet = 1 ;
94 }
95 objfs = new FileStream( this .dataPath, FileMode.Open, FileAccess.Read);
96 try
97 {
98 // objfs.Seek(0,SeekOrigin.Begin);
99 objfs.Position = 0 ;
100 byte [] buff = new Byte[ 8 ] ;
101 objfs.Read(buff, 0 , 8 );
102 firstStartIp = buff[ 0 ] + buff[ 1 ] * 256 + buff[ 2 ] * 256 * 256 + buff[ 3 ] * 256 * 256 * 256 ;
103 lastStartIp = buff[ 4 ] * 1 + buff[ 5 ] * 256 + buff[ 6 ] * 256 * 256 + buff[ 7 ] * 256 * 256 * 256 ;
104 long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0 );
105 if (recordCount <= 1 )
106 {
107 country = " FileDataError " ;
108 objfs.Close();
109 return 2 ;
110 }
111 long rangE = recordCount;
112 long rangB = 0 ;
113 long recNO = 0 ;
114 while (rangB < rangE - 1 )
115 {
116 recNO = (rangE + rangB) / 2 ;
117 this .GetStartIp(recNO);
118 if (ip_Int == this .startIp)
119 {
120 rangB = recNO;
121 break ;
122 }
123 if (ip_Int > this .startIp)
124 rangB = recNO;
125 else
126 rangE = recNO;
127 }
128 this .GetStartIp(rangB);
129 this .GetEndIp();
130 if ( this .startIp <= ip_Int && this .endIp >= ip_Int)
131 {
132 this .GetCountry();
133 this .local = this .local.Replace( " (我们一定要解放台湾!!!) " , "" );
134 }
135 else
136 {
137 nRet = 3 ;
138 this .country = " 未知 " ;
139 this .local = "" ;
140 }
141 objfs.Close();
142 return nRet;
143 }
144 catch
145 {
146 return 1 ;
147 }
148
149 }
150 #endregion
151
152 #region IP地址转换成Int数据
153 private long IpToInt( string ip)
154 {
155 char [] dot = new char []{ ' . ' };
156 string [] ipArr = ip.Split(dot);
157 if (ipArr.Length == 3 )
158 ip = ip + " .0 " ;
159 ipArr = ip.Split(dot);
160
161 long ip_Int = 0 ;
162 long p1 = long .Parse(ipArr[ 0 ]) * 256 * 256 * 256 ;
163 long p2 = long .Parse(ipArr[ 1 ]) * 256 * 256 ;
164 long p3 = long .Parse(ipArr[ 2 ]) * 256 ;
165 long p4 = long .Parse(ipArr[ 3 ]);
166 ip_Int = p1 + p2 + p3 + p4;
167 return ip_Int;
168 }
169 #endregion
170
171 #region int转换成IP
172 private string IntToIP( long ip_Int)
173 {
174 long seg1 = (ip_Int & 0xff000000 ) >> 24 ;
175 if (seg1 < 0 )
176 seg1 += 0x100 ;
177 long seg2 = (ip_Int & 0x00ff0000 ) >> 16 ;
178 if (seg2 < 0 )
179 seg2 += 0x100 ;
180 long seg3 = (ip_Int & 0x0000ff00 ) >> 8 ;
181 if (seg3 < 0 )
182 seg3 += 0x100 ;
183 long seg4 = (ip_Int & 0x000000ff );
184 if (seg4 < 0 )
185 seg4 += 0x100 ;
186 string ip = seg1.ToString() + " . " + seg2.ToString() + " . " + seg3.ToString() + " . " + seg4.ToString();
187
188 return ip;
189 }
190 #endregion
191
192 #region 获取起始IP范围
193 private long GetStartIp( long recNO)
194 {
195 long offSet = firstStartIp + recNO * 7 ;
196 // objfs.Seek(offSet,SeekOrigin.Begin);
197 objfs.Position = offSet;
198 byte [] buff = new Byte[ 7 ];
199 objfs.Read(buff, 0 , 7 );
200
201 endIpOff = Convert.ToInt64(buff[ 4 ].ToString()) + Convert.ToInt64(buff[ 5 ].ToString()) * 256 + Convert.ToInt64(buff[ 6 ].ToString()) * 256 * 256 ;
202 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 ;
203 return startIp;
204 }
205 #endregion
206
207 #region 获取结束IP
208 private long GetEndIp()
209 {
210 // objfs.Seek(endIpOff,SeekOrigin.Begin);
211 objfs.Position = endIpOff;
212 byte [] buff = new Byte[ 5 ];
213 objfs.Read(buff, 0 , 5 );
214 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 ;
215 this .countryFlag = buff[ 4 ];
216 return this .endIp;
217 }
218 #endregion
219
220 #region 获取国家/区域偏移量
221 private string GetCountry()
222 {
223 switch ( this .countryFlag)
224 {
225 case 1 :
226 case 2 :
227 this .country = GetFlagStr( this .endIpOff + 4 );
228 this .local = ( 1 == this .countryFlag ) ? " " : this .GetFlagStr( this .endIpOff + 8 );
229 break ;
230 default :
231 this .country = this .GetFlagStr( this .endIpOff + 4 );
232 this .local = this .GetFlagStr(objfs.Position);
233 break ;
234 }
235 return " " ;
236 }
237 #endregion
238
239 #region 获取国家/区域字符串
240 private string GetFlagStr( long offSet)
241 {
242 int flag = 0 ;
243 byte [] buff = new Byte[ 3 ];
244 while ( 1 == 1 )
245 {
246 // objfs.Seek(offSet,SeekOrigin.Begin);
247 objfs.Position = offSet;
248 flag = objfs.ReadByte();
249 if (flag == 1 || flag == 2 )
250 {
251 objfs.Read(buff, 0 , 3 );
252 if (flag == 2 )
253 {
254 this .countryFlag = 2 ;
255 this .endIpOff = offSet - 4 ;
256 }
257 offSet = Convert.ToInt64(buff[ 0 ].ToString()) + Convert.ToInt64(buff[ 1 ].ToString()) * 256 + Convert.ToInt64(buff[ 2 ].ToString()) * 256 * 256 ;
258 }
259 else
260 {
261 break ;
262 }
263 }
264 if (offSet < 12 )
265 return " " ;
266 objfs.Position = offSet;
267 return GetStr();
268 }
269 #endregion
270
271 #region GetStr
272 private string GetStr()
273 {
274 byte lowC = 0 ;
275 byte upC = 0 ;
276 string str = "" ;
277 byte [] buff = new byte [ 2 ];
278 while ( 1 == 1 )
279 {
280 lowC = (Byte)objfs.ReadByte();
281 if (lowC == 0 )
282 break ;
283 if (lowC > 127 )
284 {
285 upC = ( byte )objfs.ReadByte();
286 buff[ 0 ] = lowC;
287 buff[ 1 ] = upC;
288 System.Text.Encoding enc = System.Text.Encoding.GetEncoding( " GB2312 " );
289 str += enc.GetString(buff);
290 }
291 else
292 {
293 str += ( char )lowC;
294 }
295 }
296 return str;
297 }
298 #endregion
299
300 #region 获取IP地址
301 public string IPLocation()
302 {
303 this .QQwry();
304 return this .country + this .local;
305 }
306 public string IPLocation( string dataPath, string ip)
307 {
308 this .dataPath = dataPath;
309 this .ip = ip;
310 this .QQwry();
311 return this .country + this .local;
312 }
313 #endregion
314
315
316 }
317 }
2 ** File Name:IPScaner.cs
3 ** Create Date:2004-12-27 20:10:28
4 ** Modifier:
5 ** Modify Date:
6 ** Description:to scan the ip location from qqwry.dat
7 ** Version: IPScaner 1.0.0
8 ***************************************************************** */
9 using System;
10 using System.IO;
11 using System.Collections;
12 using System.Text;
13 using System.Text.RegularExpressions;
14 namespace chat.Rules
15 {
16 /**/ /// <summary>
17 /// to scan the ip location from qqwry.dat
18 /// </summary>
19 public class IPScaner
20 {
21 #region 私有成员
22 private string dataPath;
23 private string ip;
24 private string country;
25 private string local;
26
27 private long firstStartIp = 0 ;
28 private long lastStartIp = 0 ;
29 private FileStream objfs = null ;
30 private long startIp = 0 ;
31 private long endIp = 0 ;
32 private int countryFlag = 0 ;
33 private long endIpOff = 0 ;
34 private string errMsg = null ;
35 #endregion
36
37 #region 构造函数
38 public IPScaner()
39 {
40 //
41 // TODO: 在此处添加构造函数逻辑
42 //
43 }
44 #endregion
45
46 #region 公共属性
47 public string DataPath
48 {
49 set {dataPath = value;}
50 }
51 public string IP
52 {
53 set {ip = value;}
54 }
55 public string Country
56 {
57 get { return country;}
58 }
59 public string Local
60 {
61 get { return local;}
62 }
63 public string ErrMsg
64 {
65 get { return errMsg;}
66 }
67 #endregion
68
69 #region 搜索匹配数据
70 private int QQwry()
71 {
72 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])) " ;
73 Regex objRe = new Regex(pattern);
74 Match objMa = objRe.Match(ip);
75 if ( ! objMa.Success)
76 {
77 this .errMsg = " IP格式错误 " ;
78 return 4 ;
79 }
80
81 long ip_Int = this .IpToInt(ip);
82 int nRet = 0 ;
83 if (ip_Int >= IpToInt( " 127.0.0.0 " ) && ip_Int <= IpToInt( " 127.255.255.255 " ))
84 {
85 this .country = " 本机内部环回地址 " ;
86 this .local = "" ;
87 nRet = 1 ;
88 }
89 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 " )))
90 {
91 this .country = " 网络保留地址 " ;
92 this .local = "" ;
93 nRet = 1 ;
94 }
95 objfs = new FileStream( this .dataPath, FileMode.Open, FileAccess.Read);
96 try
97 {
98 // objfs.Seek(0,SeekOrigin.Begin);
99 objfs.Position = 0 ;
100 byte [] buff = new Byte[ 8 ] ;
101 objfs.Read(buff, 0 , 8 );
102 firstStartIp = buff[ 0 ] + buff[ 1 ] * 256 + buff[ 2 ] * 256 * 256 + buff[ 3 ] * 256 * 256 * 256 ;
103 lastStartIp = buff[ 4 ] * 1 + buff[ 5 ] * 256 + buff[ 6 ] * 256 * 256 + buff[ 7 ] * 256 * 256 * 256 ;
104 long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0 );
105 if (recordCount <= 1 )
106 {
107 country = " FileDataError " ;
108 objfs.Close();
109 return 2 ;
110 }
111 long rangE = recordCount;
112 long rangB = 0 ;
113 long recNO = 0 ;
114 while (rangB < rangE - 1 )
115 {
116 recNO = (rangE + rangB) / 2 ;
117 this .GetStartIp(recNO);
118 if (ip_Int == this .startIp)
119 {
120 rangB = recNO;
121 break ;
122 }
123 if (ip_Int > this .startIp)
124 rangB = recNO;
125 else
126 rangE = recNO;
127 }
128 this .GetStartIp(rangB);
129 this .GetEndIp();
130 if ( this .startIp <= ip_Int && this .endIp >= ip_Int)
131 {
132 this .GetCountry();
133 this .local = this .local.Replace( " (我们一定要解放台湾!!!) " , "" );
134 }
135 else
136 {
137 nRet = 3 ;
138 this .country = " 未知 " ;
139 this .local = "" ;
140 }
141 objfs.Close();
142 return nRet;
143 }
144 catch
145 {
146 return 1 ;
147 }
148
149 }
150 #endregion
151
152 #region IP地址转换成Int数据
153 private long IpToInt( string ip)
154 {
155 char [] dot = new char []{ ' . ' };
156 string [] ipArr = ip.Split(dot);
157 if (ipArr.Length == 3 )
158 ip = ip + " .0 " ;
159 ipArr = ip.Split(dot);
160
161 long ip_Int = 0 ;
162 long p1 = long .Parse(ipArr[ 0 ]) * 256 * 256 * 256 ;
163 long p2 = long .Parse(ipArr[ 1 ]) * 256 * 256 ;
164 long p3 = long .Parse(ipArr[ 2 ]) * 256 ;
165 long p4 = long .Parse(ipArr[ 3 ]);
166 ip_Int = p1 + p2 + p3 + p4;
167 return ip_Int;
168 }
169 #endregion
170
171 #region int转换成IP
172 private string IntToIP( long ip_Int)
173 {
174 long seg1 = (ip_Int & 0xff000000 ) >> 24 ;
175 if (seg1 < 0 )
176 seg1 += 0x100 ;
177 long seg2 = (ip_Int & 0x00ff0000 ) >> 16 ;
178 if (seg2 < 0 )
179 seg2 += 0x100 ;
180 long seg3 = (ip_Int & 0x0000ff00 ) >> 8 ;
181 if (seg3 < 0 )
182 seg3 += 0x100 ;
183 long seg4 = (ip_Int & 0x000000ff );
184 if (seg4 < 0 )
185 seg4 += 0x100 ;
186 string ip = seg1.ToString() + " . " + seg2.ToString() + " . " + seg3.ToString() + " . " + seg4.ToString();
187
188 return ip;
189 }
190 #endregion
191
192 #region 获取起始IP范围
193 private long GetStartIp( long recNO)
194 {
195 long offSet = firstStartIp + recNO * 7 ;
196 // objfs.Seek(offSet,SeekOrigin.Begin);
197 objfs.Position = offSet;
198 byte [] buff = new Byte[ 7 ];
199 objfs.Read(buff, 0 , 7 );
200
201 endIpOff = Convert.ToInt64(buff[ 4 ].ToString()) + Convert.ToInt64(buff[ 5 ].ToString()) * 256 + Convert.ToInt64(buff[ 6 ].ToString()) * 256 * 256 ;
202 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 ;
203 return startIp;
204 }
205 #endregion
206
207 #region 获取结束IP
208 private long GetEndIp()
209 {
210 // objfs.Seek(endIpOff,SeekOrigin.Begin);
211 objfs.Position = endIpOff;
212 byte [] buff = new Byte[ 5 ];
213 objfs.Read(buff, 0 , 5 );
214 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 ;
215 this .countryFlag = buff[ 4 ];
216 return this .endIp;
217 }
218 #endregion
219
220 #region 获取国家/区域偏移量
221 private string GetCountry()
222 {
223 switch ( this .countryFlag)
224 {
225 case 1 :
226 case 2 :
227 this .country = GetFlagStr( this .endIpOff + 4 );
228 this .local = ( 1 == this .countryFlag ) ? " " : this .GetFlagStr( this .endIpOff + 8 );
229 break ;
230 default :
231 this .country = this .GetFlagStr( this .endIpOff + 4 );
232 this .local = this .GetFlagStr(objfs.Position);
233 break ;
234 }
235 return " " ;
236 }
237 #endregion
238
239 #region 获取国家/区域字符串
240 private string GetFlagStr( long offSet)
241 {
242 int flag = 0 ;
243 byte [] buff = new Byte[ 3 ];
244 while ( 1 == 1 )
245 {
246 // objfs.Seek(offSet,SeekOrigin.Begin);
247 objfs.Position = offSet;
248 flag = objfs.ReadByte();
249 if (flag == 1 || flag == 2 )
250 {
251 objfs.Read(buff, 0 , 3 );
252 if (flag == 2 )
253 {
254 this .countryFlag = 2 ;
255 this .endIpOff = offSet - 4 ;
256 }
257 offSet = Convert.ToInt64(buff[ 0 ].ToString()) + Convert.ToInt64(buff[ 1 ].ToString()) * 256 + Convert.ToInt64(buff[ 2 ].ToString()) * 256 * 256 ;
258 }
259 else
260 {
261 break ;
262 }
263 }
264 if (offSet < 12 )
265 return " " ;
266 objfs.Position = offSet;
267 return GetStr();
268 }
269 #endregion
270
271 #region GetStr
272 private string GetStr()
273 {
274 byte lowC = 0 ;
275 byte upC = 0 ;
276 string str = "" ;
277 byte [] buff = new byte [ 2 ];
278 while ( 1 == 1 )
279 {
280 lowC = (Byte)objfs.ReadByte();
281 if (lowC == 0 )
282 break ;
283 if (lowC > 127 )
284 {
285 upC = ( byte )objfs.ReadByte();
286 buff[ 0 ] = lowC;
287 buff[ 1 ] = upC;
288 System.Text.Encoding enc = System.Text.Encoding.GetEncoding( " GB2312 " );
289 str += enc.GetString(buff);
290 }
291 else
292 {
293 str += ( char )lowC;
294 }
295 }
296 return str;
297 }
298 #endregion
299
300 #region 获取IP地址
301 public string IPLocation()
302 {
303 this .QQwry();
304 return this .country + this .local;
305 }
306 public string IPLocation( string dataPath, string ip)
307 {
308 this .dataPath = dataPath;
309 this .ip = ip;
310 this .QQwry();
311 return this .country + this .local;
312 }
313 #endregion
314
315
316 }
317 }
调用方式:
1
#region
测试地址搜索
2 IPScaner objScan = new IPScaner();
3 string ip = " 221.224.205.13 " ;
4 objScan.DataPath = @" E:/QQWry.Dat " ;
5 objScan.IP = ip;
6 string addre = objScan.IPLocation();
7 string err = objScan.ErrMsg;
8
9 #endregion
10
2 IPScaner objScan = new IPScaner();
3 string ip = " 221.224.205.13 " ;
4 objScan.DataPath = @" E:/QQWry.Dat " ;
5 objScan.IP = ip;
6 string addre = objScan.IPLocation();
7 string err = objScan.ErrMsg;
8
9 #endregion
10