【代码】根据ip地址取得所在城市的信息

using   System;
using   System.IO;
using   System.Collections.Generic;
using   System.Text;
using   System.Text.RegularExpressions;
namespace   ShowIP
{
        class   IPReader
        {
                  static   private   string   _dataPath   =   "./QQWry.Dat ";  
                  static   private   string   country;  
                  static   private   string   local;      
                  static   private   long   firstStartIp=0;  
                  static   private   long   lastStartIp=0;  
                  static   private   FileStream   objfs   =   null;  
                  static   private   long   startIp=0;  
                  static   private   long   endIp=0;  
                  static   private   int   countryFlag=0;  
                  static   private   long   endIpOff=0;  
   
                  #region   搜索匹配数据  
                          static   private   int   QQwry(string   ip)  
                          {  
                                  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)  
                                  {  
                                          return   4;  
                                  }  
   
                                  long   ip_Int   =   IpToInt(ip);  
                                  int   nRet=0;  
                                  if(ip_Int> =IpToInt( "127.0.0.0 ")&&ip_Int <=IpToInt( "127.255.255.255 "))  
                                  {  
                                          country= "本机内部环回地址 ";  
                                          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 ")))  
                                  {  
                                          country= "网络保留地址 ";  
                                          local= " ";  
                                          nRet=1;  
                                  }                                      
                                  try  
                                  {
                                          objfs   =   new   FileStream(_dataPath,   FileMode.Open,   FileAccess.Read);
                                          //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;  
                                                  GetStartIp(recNO);  
                                                  if(ip_Int==startIp)  
                                                  {  
                                                          rangB   =   recNO;  
                                                          break;  
                                                  }  
                                                  if(ip_Int> startIp)  
                                                          rangB=recNO;  
                                                  else  
                                                          rangE=recNO;  
                                          }  
                                          GetStartIp(rangB);  
                                          GetEndIp();  
                                          if(startIp <=ip_Int&&endIp> =ip_Int)  
                                          {  
                                                  GetCountry();  
                                                  local=local.Replace( "(我们一定要解放台湾!!!) ", " ");  
                                          }  
                                          else  
                                          {  
                                                  nRet=3;  
                                                  country= "未知 ";  
                                                  local= " ";  
                                          }  
                                          objfs.Close();  
                                          return   nRet;  
                                  }  
                                  catch  
                                  {  
                                          return   1;  
                                  }  
   
                          }  
                  #endregion  
   
                  #region   IP地址转换成Int数据  
                          static   private   long   IpToInt(string   ip)  
                          {  
                                  string[]   ipArr   =   ip.Split( '. ');
                                  if   (ipArr.Length   ==   3)
                                          ip   =   ip   +   ".0 ";
                                  ipArr   =   ip.Split( '. ');
   
                                  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  
                          static   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范围  
                          static   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  
                          static   private   long   GetEndIp()  
                          {  
                                  //objfs.Seek(endIpOff,SeekOrigin.Begin);  
                                  objfs.Position=endIpOff;  
                                  byte   []   buff   =   new   Byte[5];  
                                  objfs.Read(buff,0,5);  
                                  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;  
                                  countryFlag=buff[4];  
                                  return   endIp;  
                          }  
                  #endregion   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值