https://www.ipip.net/download.html

https://github.com/17mon/csharp

IpAndPositionHelper
  public class IpAndPositionHelper
{
#region Resource
public static bool EnableFileWatch = false; private static int offset;
private static uint[] index = new uint[];
private static byte[] dataBuffer;
private static byte[] indexBuffer;
private static long lastModifyTime = 0L;
private static string ipFile;
private static readonly object @lock = new object();
#endregion #region LoadDat
public static void Load(string filename)
{
ipFile = new FileInfo(filename).FullName;
Load();
if (EnableFileWatch)
{
Watch();
}
} private static void Load()
{
lock (@lock)
{
var file = new FileInfo(ipFile);
lastModifyTime = file.LastWriteTime.Ticks;
try
{
dataBuffer = new byte[file.Length];
using (var fin = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
{
fin.Read(dataBuffer, , dataBuffer.Length);
} var indexLength = BytesToLong(dataBuffer[], dataBuffer[], dataBuffer[], dataBuffer[]);
indexBuffer = new byte[indexLength];
Array.Copy(dataBuffer, , indexBuffer, , indexLength);
offset = (int)indexLength; for (var loop = ; loop < ; loop++)
{
index[loop] = BytesToLong(indexBuffer[loop * + ], indexBuffer[loop * + ],
indexBuffer[loop * + ],
indexBuffer[loop * ]);
}
}
catch (Exception ex)
{
throw ex;
}
}
} private static uint BytesToLong(byte a, byte b, byte c, byte d)
{
return ((uint)a << ) | ((uint)b << ) | ((uint)c << ) | d;
} private static void Watch()
{
var file = new FileInfo(ipFile);
if (file.DirectoryName == null) return;
var watcher = new FileSystemWatcher(file.DirectoryName, file.Name) { NotifyFilter = NotifyFilters.LastWrite };
watcher.Changed += (s, e) =>
{
var time = File.GetLastWriteTime(ipFile).Ticks;
if (time > lastModifyTime)
{
Load();
}
};
watcher.EnableRaisingEvents = true;
}
#endregion #region FindIP
public static string[] Find(string ip)
{
lock (@lock)
{
var ips = ip.Split('.');
var ip_prefix_value = int.Parse(ips[]);
long ip2long_value = BytesToLong(byte.Parse(ips[]), byte.Parse(ips[]), byte.Parse(ips[]),
byte.Parse(ips[]));
var start = index[ip_prefix_value];
var max_comp_len = offset - ;
long index_offset = -;
var index_length = -;
byte b = ;
for (start = start * + ; start < max_comp_len; start += )
{
if (
BytesToLong(indexBuffer[start + ], indexBuffer[start + ], indexBuffer[start + ],
indexBuffer[start + ]) >= ip2long_value)
{
index_offset = BytesToLong(b, indexBuffer[start + ], indexBuffer[start + ],
indexBuffer[start + ]);
index_length = 0xFF & indexBuffer[start + ];
break;
}
}
var areaBytes = new byte[index_length];
Array.Copy(dataBuffer, offset + (int)index_offset - , areaBytes, , index_length);
return Encoding.UTF8.GetString(areaBytes).Split('\t');
}
}
#endregion
}
        [TestMethod()]
public void FindTest()
{
IpAndPositionHelper.EnableFileWatch = true; // 默认值为:false,如果为true将会检查ip库文件的变化自动reload数据
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "APP_Data\\tinyipdata_utf8.dat"); //合并目录
IpAndPositionHelper.Load(path);//加载 var infos = IpAndPositionHelper.Find("180.169.67.130");//查询 var result = string.Join("-", infos).TrimEnd('-'); //中国-上海 }

附IP解析文件:

17monipdb4ecdz.zip

17monipdb根据IP获得区域的更多相关文章

  1. 网站定位之---根据IP获得区域

    记得以前做一个培训机构网站时候需要定位,那时候用的搜狐的api,不是很精准. demo:https://github.com/dunitian/LoTCodeBase/tree/master/NetC ...

  2. 超好用的ip归属区域查询

    源码如下: #!/usr/bin/env python#-*-coding:utf-8-*- import requestsfrom bs4 import BeautifulSoupimport re ...

  3. java web获取客户端外网ip和所在区域

    @参考文章1.@参考文章2.@参考文章3.@参考文章4,@之前同事的项目 controller @Controller @RequestMapping("/home") publi ...

  4. 网络通信分享(二):外网ip和内网ip

    一.内网ip包括两类: 1:tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255  172.16.0.0/ ...

  5. TCP/IP详解学习笔记(6)-- IP选路

    1.概述      路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类      从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. 静态路由选 ...

  6. TCP/IP——内外网IP+子网掩码作用+PING(网络总结)

    目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...

  7. IP选路

    IP选路 1.概述      路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类      从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. ...

  8. ip识别运用

    tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255 172.16.0.0/12:172.16.0.0-1 ...

  9. PHP 获取IP地址位置信息「聚合数据API」

    聚合数据 提供了[查询IP所属区域]的服务接口,只需要以 GET 请求的方式向 API 传入 IP地址 和 APPKEY 即可获得查询结果. 这里的难点主要在于如何通过PHP获取客户端IP地址,以及如 ...

随机推荐

  1. 在Linux上自动调整屏幕亮度保护眼睛

    导读 Lightbot当你开始在计算机前花费大量时间的时候,问题自然开始显现.这健康吗?怎样才能舒缓我眼睛的压力呢?为什么光线灼烧着我?尽管解答这些问题的研究仍然在不断进行着,许多程序员已经采用了一些 ...

  2. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法

    如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...

  3. SSIS包部署错误之运行环境设置

    在SQLServer代理处新建了一个job,步骤里面的操作是指向一个SSIS模型包 执行,报错如下 根据报错信息是64bit,于是做出修改如下图 再次执行 OK

  4. Cognos Report Studio 链接查询需要注意的地方2

    在Report Studio里面用SQL设计报表,查询2,查询3 要链接一般按条件  a1=b1 在选择链接方式需要注意的地方: 默认链接 外部链接 需要设置打开FM,打开报表设计引用的数据包(FM- ...

  5. Cognos 报表在列表上面显示汇总

    一直以来,Cognos Report Studio设计报表的时候,汇总默认显示在列表下方: 1如图,拖一个列表 2运行如下,数据显示正常按日期排序 3选中订单笔数.订单金额,添加自动汇总 4:运行,可 ...

  6. (转)NGUI制作转圈的技能CD特效

    在技能图标上面放个半透明的精灵,用来做技能冷却的特效,如下图所示,我就用NGUI中的图标来带代替. NGUI制作转圈的技能CD特效 然后修改一下特效的精灵类型,它是在技能图标上面悬浮半透明可旋转的精灵 ...

  7. 读取Mat文件中的汉字代码

    拿到一种元数据,格式为*.mat,但Access打不开,百度也没看到比较好的解决方案. 但是用文本文档可以打开,那估计它和txt类似了,于是想自己写代码来处理了,立马写了读取的丑陋工具.读取是没什么问 ...

  8. ZH奶酪:纯CSS自定义Html中Checkbox复选框样式

    原文链接:http://www.lrxin.com/archives-683.html 首先看下效果: 点击演示地址查看实例. 首先,需要添加一段CSS隐藏所有的Checkbox复选框,之后我们会改变 ...

  9. ZH奶酪:Word断字功能不可用。请运行Microsoft Office安装程序安装该功能,然后重试。

    断字功能就是英文单词遇到换行时候会自动添加一个“-”符号来连接跨行的单词. 此外,英文单词拼写校验的功能也是这样添加. 问题如图所示: 解决方法: 打开安装程序“setup.exe”——点击“添加或删 ...

  10. VC操作MPP文件

    1.背景简介 因需要对Office系列进行程序操作,特需要使用COM编程. Microsoft Project生成进度计划,office家族软件,文件后缀为.mpp. 具体信息见维基百科http:// ...