ip地址扫描器

该类可以根据 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 } }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值