.NET读取QQWry.Dat 纯真版ip数据库格式数据源

.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 

调用方式:
 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 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值