using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;namespace AIMSCommon
{/// <summary>  /// 根据IP地址查询所在地/// </summary>  public class IPScanerHelper{#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 IPScanerHelper(){//  // 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})|(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;elserangE = 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转换成IPprivate 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 获取结束IPprivate 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 GetStrprivate 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}
}

转载于:https://www.cnblogs.com/zhangxiaolei521/p/5661011.html

根据IP地址查询所在地相关推荐

  1. 利用IP地址查询接口来查询IP归属地

    如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地.今儿个在网上了解了这些接口,要么返回XML, ...

  2. 全球IP地址查询完整版

    突然在某某网站看到IP地址查询,于是心血来潮做了一个.这是用asp查询全球IP地址的程式,由于类似的的用Asp查询IP的速度不是很理想,本人使用的也是宏志宏的IP地址数据库,只是对它进行了改进. 本人 ...

  3. 用java程序编写ip仿真器_用java 编写一个可以实现IP地址查询功能的课程设计

    展开全部 下面是获得本机IP地址的方法,跟你的程序捆绑起来,互相发送消息的时候直接将IP发送过去 private static String[] getAllLocalHostIP(){ 323131 ...

  4. android的百度地图sdk获取ip,基于百度地图API的ip地址查询

    说明:使用ip地址查询太麻烦,偶然搜索发现有人已经写过基于百度API的ip地址查询,这个是前人的结晶,我只是修改了一些,勿喷. 用的python2.7,编码问题真是坑. 百度mapAPI私钥申请:ht ...

  5. 微信小程序开发-IP地址查询-例子

    微信小程序开发  小程序搜索框  IP地址查询  搜索查询  样例 微信小程序 开发 参考   https://mp.weixin.qq.com/debug/wxadoc/dev/component/ ...

  6. php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码

    * 纯真 IP 数据库查询 * * 参考资料: * - 纯真 IP 数据库 http://www.cz88.net/ip/ * - PHP 读取纯真IP地址数据库 http://ju.outofmem ...

  7. 发布IP地址查询的WEB SERVICE

    在值得期待的2005来临之际,发布IP地址查询WEB SERVICE,顺祝博客园的所有朋友们,新年快乐,新年好心情. http://IPLOOKUP.ASPSIR.COM 此外,WHOIS查询WEB ...

  8. 公用ip地址查询_是什么使您无法更改公用IP地址并在Internet上造成严重破坏?

    公用ip地址查询 What exactly is preventing you (or anyone else) from changing their IP address and causing ...

  9. 根据IP地址查询其所属城市

    提供查询接口的网站收藏: 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪多地域测试方法:http ...

  10. win7个人计算机的ip地址,win7计算机ip地址查询_win7本机ip地址查询

    2016-12-09 11:40:21 查找计算机的ip地址的方法:点击你的电脑桌面左下角的"开始"找到"运行"点击运行, 在出现的对话框里面输入"c ...

最新文章

  1. mysql用户权限管理的问题
  2. 华为三层交换机(5328)DHCP中继应用配置实例
  3. 双活数据中心对企业的帮助
  4. Java类加载笔记(1)
  5. java爬虫问题二: 使用jsoup爬取数据class选择器中空格多选择怎么解决
  6. 四、爬虫中的urllib库使用
  7. 表格合并行_合并行table表格
  8. mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑
  9. 北航校赛2014 预赛 题解
  10. 孔维滢 20171010110《面向对象程序设计(java)》第十七周学习总结
  11. python中如何计算集合的长度_Python如何计算序列长度 python dataframe中元素如何统计?...
  12. 每日算法系列【LeetCode 328】奇偶链表
  13. oom killer lmkd killer
  14. mysql杏林中医诊所管理系统毕业设计源码133742
  15. MATLAB疲劳检测系统
  16. 【转帖】文件系统驱动编程基础篇
  17. 英语知识系列:26个字母在单词中的发音总结
  18. 杆刚度校核c语言程序,第12章杆件的强度、刚度计算.doc
  19. WEKA( OneR,过拟合)
  20. python six 用途_python之six用法

热门文章

  1. 基于 Text-CNN 的情感分析(文本分类)----概念与应用
  2. unity3d + lua + 斗地主 系列 (1) 创建扑克对象
  3. android 连笔记本无线上网,android手机通过笔记本的网络实现无线wifi上网
  4. Javascript图片裁切
  5. Chrome 任务栏图标变白色 解决方法
  6. HTML制作导航条的方法
  7. winXP和win2003双系统下启动NTDETECT错误解决方法
  8. 怎样重装计算机系统软件,电脑重装系统软件怎么样保留
  9. 如何在51单片机实现日程提醒(生日闹钟)
  10. SpringBoot apple苹果支付回调验证