17monipdb根据IP获得区域
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解析文件:
17monipdb根据IP获得区域的更多相关文章
- 网站定位之---根据IP获得区域
记得以前做一个培训机构网站时候需要定位,那时候用的搜狐的api,不是很精准. demo:https://github.com/dunitian/LoTCodeBase/tree/master/NetC ...
- 超好用的ip归属区域查询
源码如下: #!/usr/bin/env python#-*-coding:utf-8-*- import requestsfrom bs4 import BeautifulSoupimport re ...
- java web获取客户端外网ip和所在区域
@参考文章1.@参考文章2.@参考文章3.@参考文章4,@之前同事的项目 controller @Controller @RequestMapping("/home") publi ...
- 网络通信分享(二):外网ip和内网ip
一.内网ip包括两类: 1:tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255 172.16.0.0/ ...
- TCP/IP详解学习笔记(6)-- IP选路
1.概述 路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类 从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. 静态路由选 ...
- TCP/IP——内外网IP+子网掩码作用+PING(网络总结)
目录: 1.如何区分内网IP和外网IP? 保留字段 2.子网掩码是起什么作用的? 将DNS和IP异或,表示哪段起作用 3.ping到底起什么作用? ping本地.ping远程 下面针对上面三个问题分别 ...
- IP选路
IP选路 1.概述 路由算法是用于获取路由表中的路由项目.它是路由选择协议的核心. 2.路由算法的分类 从路由算法能否随网络的通信量或拓扑自适应的进行调整变化来分,可以分为两类. ...
- 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 ...
- PHP 获取IP地址位置信息「聚合数据API」
聚合数据 提供了[查询IP所属区域]的服务接口,只需要以 GET 请求的方式向 API 传入 IP地址 和 APPKEY 即可获得查询结果. 这里的难点主要在于如何通过PHP获取客户端IP地址,以及如 ...
随机推荐
- HDU1161 Eddy's mistakes
Eddy's mistakes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- js移除Array中指定元素
首先需要找到元素的下标: var array = [2, 5, 9]; var index = array.indexOf(5); 使用splice函数进行移除: if (index > -1) ...
- TJ Holowaychuk是怎样学习编程的?
TJ Holowaychuk是怎样学习编程的? 学习了:https://blog.csdn.net/wozaixiaoximen/article/details/49507111 Q:TJ Holow ...
- Passing address of non-local object to __autoreleasing parameter for write-back
在希望通过函数的參数返回Objective-C对象的时候.遇到了这个问题 错误代码例如以下: - (void)methodA:(NSString **)string<span style=&qu ...
- java 笔试之在线模拟
网站地址: https://www.nowcoder.com
- GIS+=地理信息+容器技术(4)——Docker执行
-------------------------------------------------------------------------------------- Blog: http ...
- 通过Js对电话和姓名身份证等进行部分隐藏处理
在进行web前端页面开发中,有时需要从后台获取用户数据来显示在前台页面,但是考虑到用户信息安全的问题,就需要对这些信息进行处理,使其不完全显示出来,例如姓名,两个字的显示姓,名字用*代替,电话前三位和 ...
- Linux网卡高级命令
网卡的高级命令 [root@gechong ~]# mii-tool No interface specified usage: mii-tool [-VvRrwl] [-A media,... | ...
- POJ1679 The Unique MST 【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20421 Accepted: 7183 D ...
- lftp mirror 上传目录
1. lftp的确很强大, 要学习一下. sudo yum install lftp (测试了一下,ftp软件才92K,lftp有2.3M) 2. lftp mirror 能上 ...