博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通用类 IPScanner 利用纯真IP数据库(QQWry.dat)查询IP所在地
阅读量:6772 次
发布时间:2019-06-26

本文共 9536 字,大约阅读时间需要 31 分钟。

///     /// 利用纯真IP数据库(QQWry.dat)查询IP所在地    /// 优点:查询速度快、方便更新IP库    ///     public static class IPScanner    {        private static string dataPath = HttpContext.Current.Server.MapPath("/Plugin/qqwry.dat");        private static string ip;        private static string country;        private static string local;        private static long firststartIP = 0;        private static long laststartIP = 0;        private static FileStream objfs = null;        private static long startIP = 0;        private static long endIP = 0;        private static int countryFlag = 0;        private static long endIPOff = 0;        //private static string errMsg = null;        #region 搜索匹配数据        private static int QQwry()        {            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;            }            objfs = new FileStream(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;                    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是否合法        ///         /// 检验IP是否合法        ///         /// 需要检验的IP        /// 
True 合法/False 非法
public static bool CheckIP(string checkIP) { 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 + "IP"); Match objMa = objRe.Match(checkIP + "IP"); if (objMa.Success) { return true; } else { return false; } } #endregion #region IP字符串转换成Int数据 /// /// 将IP字符串转换成Int数据 /// /// IP字符串 ///
Int数据
public static 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字符串 /// /// 将Int数据转换成IP字符串 /// /// ///
public static 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 static 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 static 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 #region 获取国家/区域偏移量 private static string GetCountry() { switch (countryFlag) { case 1: case 2: country = GetFlagStr(endIPOff + 4); local = (1 == countryFlag) ? " " : GetFlagStr(endIPOff + 8); break; default: country = GetFlagStr(endIPOff + 4); local = GetFlagStr(objfs.Position); break; } return " "; } #endregion #region 获取国家/区域字符串 private static 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) { countryFlag = 2; 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 static 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地址 /// /// 根据IP查询所在地 /// /// 查询IP ///
所在地
public static string IPLocation(string scanIP) { if (CheckIP(scanIP) == true) { ip = scanIP; QQwry(); country = country.Trim().Replace("CZ88.NET", ""); local = local.Trim().Replace("CZ88.NET", ""); string location = country + " " + local; return location.Trim(); } else { return "非法的IP地址"; } } #endregion }

 

转载于:https://www.cnblogs.com/acyy/archive/2012/08/29/2662239.html

你可能感兴趣的文章
从马云的"DT时代"到林奇的"数据产业"
查看>>
手游公司安全负责人:在安全管理的Hard模式中,当一个好“玩家”
查看>>
JVM学习笔记(三)——虚拟机类加载机制
查看>>
《编写高质量代码:改善c程序代码的125个建议》——建议18-3:避免浮点变量用“==”或“!=”与0进行比较...
查看>>
知名公司拿我的开源软件( XXL-JOB)申请国家知识专利,我该怎么办?
查看>>
《C语言编程魔法书:基于C11标准》——2.9 本章小结
查看>>
BabyBluetooth|简单易用的 OSX/iOS 蓝牙库
查看>>
《统计会犯错——如何避免数据分析中的统计陷阱》一一第2章 统计功效与低功效统计...
查看>>
《音乐达人秀:Adobe Audition实战200例》——实例15 用“穿插录音”修复唱错的几句...
查看>>
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一 1.1 引言...
查看>>
白宫公布联邦开源代码政策
查看>>
抽象类与接口的区别
查看>>
《Raspberry Pi用户指南》——1.1 ARM vs. x86
查看>>
《Python硬件编程实战》——1.4 Python的应用
查看>>
EasyIOS: 如何提升 iOS 开发效率
查看>>
《DevOps实战:VMware管理员运维方法、工具及最佳实践》——第3章 建立DevOps配置管理测试环境 3.1用AutoLab进行环境配给...
查看>>
Java NIO系列教程(三) Buffer
查看>>
《JavaScript面向对象编程指南(第2版)》——1.4 展望未来
查看>>
chrome好用插件和第三方工具
查看>>
测者的性能测试手册:一分钟掌握LoadRunner关联函数应该放在那
查看>>