Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7693942
  • 博文数量: 637
  • 博客积分: 10265
  • 博客等级: 上将
  • 技术积分: 6165
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-12 22:00
文章分类

全部博文(637)

文章存档

2011年(1)

2010年(1)

2009年(3)

2008年(12)

2007年(44)

2006年(156)

2005年(419)

2004年(1)

分类:

2005-05-24 20:19:55

费了不少工夫才找到的

/******************************************************************
** File Name:IPScanner.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: IPScanner 1.0.0
******************************************************************/
using System;
using System.IO;
using System.Collections;
using System.Text;
using System.Text.RegularExpressions;
namespace PPTech.ESP.Component
{
 ///


 /// to scan the ip location from qqwry.dat
 ///

 public class IPScanner
 {
  #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 IPScanner()
  {
   //
   // 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})|(1d{2})|(2[0-4]d)|(25[0-5])).){3}((d{1,2})|(1d{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    {
     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地址
  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

  
 }
}

阅读(3986) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~