根据IP地址查询所在地
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地址查询所在地相关推荐
- 利用IP地址查询接口来查询IP归属地
如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地.今儿个在网上了解了这些接口,要么返回XML, ...
- 全球IP地址查询完整版
突然在某某网站看到IP地址查询,于是心血来潮做了一个.这是用asp查询全球IP地址的程式,由于类似的的用Asp查询IP的速度不是很理想,本人使用的也是宏志宏的IP地址数据库,只是对它进行了改进. 本人 ...
- 用java程序编写ip仿真器_用java 编写一个可以实现IP地址查询功能的课程设计
展开全部 下面是获得本机IP地址的方法,跟你的程序捆绑起来,互相发送消息的时候直接将IP发送过去 private static String[] getAllLocalHostIP(){ 323131 ...
- android的百度地图sdk获取ip,基于百度地图API的ip地址查询
说明:使用ip地址查询太麻烦,偶然搜索发现有人已经写过基于百度API的ip地址查询,这个是前人的结晶,我只是修改了一些,勿喷. 用的python2.7,编码问题真是坑. 百度mapAPI私钥申请:ht ...
- 微信小程序开发-IP地址查询-例子
微信小程序开发 小程序搜索框 IP地址查询 搜索查询 样例 微信小程序 开发 参考 https://mp.weixin.qq.com/debug/wxadoc/dev/component/ ...
- php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码
* 纯真 IP 数据库查询 * * 参考资料: * - 纯真 IP 数据库 http://www.cz88.net/ip/ * - PHP 读取纯真IP地址数据库 http://ju.outofmem ...
- 发布IP地址查询的WEB SERVICE
在值得期待的2005来临之际,发布IP地址查询WEB SERVICE,顺祝博客园的所有朋友们,新年快乐,新年好心情. http://IPLOOKUP.ASPSIR.COM 此外,WHOIS查询WEB ...
- 公用ip地址查询_是什么使您无法更改公用IP地址并在Internet上造成严重破坏?
公用ip地址查询 What exactly is preventing you (or anyone else) from changing their IP address and causing ...
- 根据IP地址查询其所属城市
提供查询接口的网站收藏: 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪多地域测试方法:http ...
- win7个人计算机的ip地址,win7计算机ip地址查询_win7本机ip地址查询
2016-12-09 11:40:21 查找计算机的ip地址的方法:点击你的电脑桌面左下角的"开始"找到"运行"点击运行, 在出现的对话框里面输入"c ...
最新文章
- mysql用户权限管理的问题
- 华为三层交换机(5328)DHCP中继应用配置实例
- 双活数据中心对企业的帮助
- Java类加载笔记(1)
- java爬虫问题二: 使用jsoup爬取数据class选择器中空格多选择怎么解决
- 四、爬虫中的urllib库使用
- 表格合并行_合并行table表格
- mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑
- 北航校赛2014 预赛 题解
- 孔维滢 20171010110《面向对象程序设计(java)》第十七周学习总结
- python中如何计算集合的长度_Python如何计算序列长度 python dataframe中元素如何统计?...
- 每日算法系列【LeetCode 328】奇偶链表
- oom killer lmkd killer
- mysql杏林中医诊所管理系统毕业设计源码133742
- MATLAB疲劳检测系统
- 【转帖】文件系统驱动编程基础篇
- 英语知识系列:26个字母在单词中的发音总结
- 杆刚度校核c语言程序,第12章杆件的强度、刚度计算.doc
- WEKA( OneR,过拟合)
- python six 用途_python之six用法