C#根据ip获取地理位置信息的方法,史上最全
商业收费
- 百度地图
- 高德地图
- 腾讯地图
- 纯真IP
开源免费
纯真ip免费版
以前可以直接下载,现在获取ip数据库的方式改变了,自行官网查看把,个人或者学术研究,商用追责,商业用途慎用
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
using System;
using Microsoft.Extensions.Options;
using Youhuo.ConfigModel;
using System.Text.RegularExpressions;namespace Stu01
{public class IPSearchHelper{private readonly IOptions<ChunZhenSetting> options;System.IO.FileStream ipFile;long ip;public IPSearchHelper(IOptions<ChunZhenSetting> options){this.options = options;}///<summary>/// 地理位置,包括国家和地区///</summary>public struct IPLocation{public string country, area;}///<summary>/// 获取指定IP所在地理位置///</summary>///<param name="strIP">要查询的IP地址</param>///<returns></returns>public IPLocation GetIPLocation(string strIP){IPLocation loc = new IPLocation();//return loc;if (string.IsNullOrEmpty(strIP)){return loc;}var match = Regex.Match(strIP, @"^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$");if (!match.Success){return loc;}ip = IPToLong(strIP);var RegexStr = @"(^[\/\\].*)|(.*:.*)";//判断是不是绝对路径,options.Value.DatPath纯真数据库存放的路径if (System.Text.RegularExpressions.Regex.IsMatch(options.Value.DatPath, RegexStr)){ipFile = new System.IO.FileStream(options.Value.DatPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);}else{var fullPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), options.Value.DatPath);ipFile = new System.IO.FileStream(fullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);}long[] ipArray = BlockToArray(ReadIPBlock());long offset = SearchIP(ipArray, 0, ipArray.Length - 1) * 7 + 4;ipFile.Position += offset;//跳过起始IPipFile.Position = ReadLongX(3) + 4;//跳过结束IPint flag = ipFile.ReadByte();//读取标志if (flag == 1)//表示国家和地区被转向{ipFile.Position = ReadLongX(3);flag = ipFile.ReadByte();//再读标志}long countryOffset = ipFile.Position;loc.country = ReadString(flag);if (flag == 2){ipFile.Position = countryOffset + 3;}flag = ipFile.ReadByte();loc.area = ReadString(flag);ipFile.Close();ipFile = null;return loc;}///<summary>/// 将字符串形式的IP转换位long///</summary>///<param name="strIP"></param>///<returns></returns>public long IPToLong(string strIP){if (strIP.Equals("::1")){strIP = "127.0.0.1";}byte[] ip_bytes = new byte[8];string[] strArr = strIP.Split(new char[] { '.' });if (strArr.Length <= 1){return 0;}byte tmpNumber;for (int i = 0; i < 4; i++){var res = byte.TryParse(strArr[3 - i], out tmpNumber);ip_bytes[i] = res ? tmpNumber : (byte)0;}return BitConverter.ToInt64(ip_bytes, 0);}///<summary>/// 将索引区字节块中的起始IP转换成Long数组///</summary>///<param name="ipBlock"></param>long[] BlockToArray(byte[] ipBlock){long[] ipArray = new long[ipBlock.Length / 7];int ipIndex = 0;byte[] temp = new byte[8];for (int i = 0; i < ipBlock.Length; i += 7){Array.Copy(ipBlock, i, temp, 0, 4);ipArray[ipIndex] = BitConverter.ToInt64(temp, 0);ipIndex++;}return ipArray;}///<summary>/// 从IP数组中搜索指定IP并返回其索引///</summary>///<param name="ipArray">IP数组</param>///<param name="start">指定搜索的起始位置</param>///<param name="end">指定搜索的结束位置</param>///<returns></returns>int SearchIP(long[] ipArray, int start, int end){int middle = (start + end) / 2;if (middle == start)return middle;else if (ip < ipArray[middle])return SearchIP(ipArray, start, middle);elsereturn SearchIP(ipArray, middle, end);}///<summary>/// 读取IP文件中索引区块///</summary>///<returns></returns>byte[] ReadIPBlock(){long startPosition = ReadLongX(4);long endPosition = ReadLongX(4);long count = (endPosition - startPosition) / 7 + 1;//总记录数ipFile.Position = startPosition;byte[] ipBlock = new byte[count * 7];ipFile.Read(ipBlock, 0, ipBlock.Length);ipFile.Position = startPosition;return ipBlock;}///<summary>/// 从IP文件中读取指定字节并转换位long///</summary>///<param name="bytesCount">需要转换的字节数,主意不要超过8字节</param>///<returns></returns>long ReadLongX(int bytesCount){byte[] _bytes = new byte[8];ipFile.Read(_bytes, 0, bytesCount);return BitConverter.ToInt64(_bytes, 0);}///<summary>/// 从IP文件中读取字符串///</summary>///<param name="flag">转向标志</param>///<returns></returns>string ReadString(int flag){if (flag == 1 || flag == 2)//转向标志ipFile.Position = ReadLongX(3);elseipFile.Position -= 1;List<byte> list = new List<byte>();byte b = (byte)ipFile.ReadByte();while (b > 0){list.Add(b);b = (byte)ipFile.ReadByte();}Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);return Encoding.GetEncoding("GB2312").GetString(list.ToArray());}}
}
但是有高并发问题
ip2region
提供了多种语言的支持,更新频率高,支持高并发
Install-Package IP2Region.Net
下载保存xdbhttps://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb

//这里为啥直接填写ip2region.xdb,因为用了始终复制
ISearcher searcher = new Searcher(CachePolicy.File, "ip2region.xdb");
var ipResult = searcher.Search("123.232.22.18");

iptools
C#版本,简单易用,支持高并发响应快,但是更新频率不高
Install-Package IPTools.China
下载ip数据库https://github.com/stulzq/IPTools/raw/master/db/ip2region.db,设置为始终复制

运行代码即可
IpTool.Search("your ip address");
结果
{"IpAddress":"123.232.22.18","Country":"中国","CountryCode":null,"Province":"山东","ProvinceCode":null,"City":"济南","PostCode":null,"NetworkOperator":"联通","Latitude":0,"Longitude":0,"AccuracyRadius":null
}
相关文章:
C#根据ip获取地理位置信息的方法,史上最全
商业收费 百度地图高德地图腾讯地图纯真IP 开源免费 纯真ip免费版 以前可以直接下载,现在获取ip数据库的方式改变了,自行官网查看把,个人或者学术研究,商用追责,商业用途慎用 using System.Collections.Generic; us…...
Git问题汇总
1.取消全局代理 一般报错Failed to connect to github.com port 443 after 21089 ms: Couldn’t connect to server 取消全局代理: git config --global --unset http.proxygit config --global --unset https.proxy#或者 git config --global http.proxy http://…...
【linux 0.11 学习记录】一、环境配置,用Bochs输出hello world
想学习linux,又不知道从哪里下手,体系太大,哪块内容都很多,无奈下选择了linux0.11作为入口,本系列将是学习笔记,希望能坚持下去吧 环境配置 这里使用win10bochs2.7 安装bochs 官网:https://b…...
【LeetCode75】第七十三题 用最少数量的箭引爆气球
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 本题和上一题基本一样,上一题是要我们尽量让区间不重叠,而本题是要我们尽量让区间重叠。 所以我们的做法和上一题…...
航天科技×辰安科技 打造智慧化工园区安全保障平台
近年来,国内化工园区安全事故频发,多起化工园区重特大事故造成了严重人员财产损失的同时,也重创了行业的整体发展。在智能制造和工业互联网的背景下,建设智慧化工园区,使用智能化手段实现安全生产是解决当前化工园区安…...
6-2 分治法求解金块问题
description 老板有一袋金块(共n块,2≤n≤100),两名最优秀的雇员每人可以得到其中的一块,排名第一的得到最重的金块,排名第二的则得到袋子中最轻的金块。 输入一个正整数N(2≤N≤100ÿ…...
A062-防火墙安全配置-配置Iptables防火墙策略
实验步骤: 【教学资源类别】 序号 类别 打勾√ 1 学习资源 √ 2 单兵模式赛题资源 3 分组对抗赛题资源 【教学资源名称】 防火墙安全配置-配置安全设置iptables防火墙策略 【教学资源分类】 一级大类 二级大类 打勾√ 1.安全标准 法律法规 行业标准 安全…...
Java包装类
在Java中不能自己定义基本数据类型对象,为了将基本数据类型视为对象进行处理,并能连接相关方法,Java为每个基本数据类型都提供了【包装类】如int型数值的包装类【Integer】,boolean型数值的包装类【Boolean】,这样就可以把这些基本数据类型转…...
常用字符字符串处理函数
isdigit、isalnum、isalpha、islower、issupper都是C/C 语言中判断字符的一些函数,灵活利用在刷题中可以节省我们的一部分时间。下面c统一为char类型字符 1.isdigit 若参数c为十进制数字0~9,则返回非0值,否则返回0。 其中isxdigital判断是…...
【汇编语言特别篇】DOSBox及常用汇编工具的详细安装教程
文章目录 📋前言一. ⛳️dosbox的介绍、下载和安装1.1 🔔dosbos简介1.2 🔔dosbox的下载1.2.1 👻方式一:官网下载(推荐)1.2.2 👻方式二:网盘安装包 1.3 🔔dosbox的安装1.4 ǵ…...
【牛客网刷题(数据结构)】:环形链表的约瑟夫问题
描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少? O(n) 示例1 好环形链表的约瑟夫问题是一个经典的问…...
虾皮印尼买家号如何注册
虾皮(Shopee)是一个流行的电子商务平台,想要注册虾皮印尼买家号,可以按照以下步骤进行操作: 1、访问虾皮印尼站点:打开浏览器,输入虾皮印尼官网 2、点击"注册":在网站的…...
SpringBoot WebService服务端客户端使用教程
服务端: 依赖 <!-- webservice相关依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><dependency><groupId&…...
【Python 千题 —— 基础篇】字符串长度
题目描述 题目描述 获取字符串长度是编程过程中常用的操作之一。编写一个程序,输入一个字符串,然后输出字符串的长度。 输入描述 输入一个字符串。 输出描述 程序将输入的字符串的长度输出。 代码讲解 下面是本题的代码: # 描述: 输…...
AIGC - 入门向量空间模型
文章目录 向量和向量空间向量的运算什么是向量空间?向量空间的几个重要概念向量之间的距离曼哈顿距离(Manhattan Distance)欧氏距离(Euclidean Distance)切比雪夫距离(Chebyshev Distance) 向量…...
python中使用xml.dom.minidom模块读取解析xml文件
python中可以使用xml.dom.minidom模块读取解析xml文件 xml.dom.minidom模块应该是内置模块不用下载安装 对于一个xml文件来说比如这个xml文件的内容为如下 <excel version"1.0" author"huangzhihui"><table id"1"><colum id&qu…...
计算机网络第一章补充整理(计算机网络体系结构)
前言:以下整理内容,参考《计算机网络自顶向下》和哈工大的计网慕课 目录 计算机网络的体系结构的一些概念为什么采用分层结构?分层结构的优点分层结构的缺点 开放系统互连(OSI)参考模型物理层功能数据链路层功能网络层…...
2023_Spark_实验十七:导入招聘大数据(项目)
一、爬虫爬取的招聘网站数据 二、在MySQL中创建空表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for jd_jobs -- ---------------------------- DROP TABLE IF EXISTS jd_jobs; CREATE TABLE jd_jobs (job_name text,job_date text,minSale…...
小程序无感刷新
下载wechat-http依赖 npm install wechat-http封装请求拦截器和相应拦截器,借助refreshToken实现无感刷新 // 导入 http 模块 import http from wechat-http // 基础路径,同时需添加合法请求域名 http.baseURL https://live-api.itheima.net // 配置请…...
Unity C#随笔:简述String和StringBuilder的区别
1.、String: 不可变性(Immutability): String对象一旦被创建,就不能被修改。每次对String对象进行操作时,实际上是创建了一个新的String对象,然后对象的引用重新指向这个新的对象。性能&#x…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
