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…...
如何用ContextMenuManager彻底掌控Windows右键菜单?4阶段优化法让操作效率提升300%
如何用ContextMenuManager彻底掌控Windows右键菜单?4阶段优化法让操作效率提升300% 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是…...
intv_ai_mk11惊艳效果展示:输入‘设计一个碳中和主题PPT’→大纲+每页文案+视觉建议
intv_ai_mk11惊艳效果展示:输入设计一个碳中和主题PPT→大纲每页文案视觉建议 1. 效果预览:从简单指令到完整PPT方案 当我向intv_ai_mk11输入"设计一个碳中和主题PPT"这个简单指令时,它在30秒内就生成了一个专业级的完整方案。这…...
昇腾910B分布式微调避坑指南:从SSH免密到权重合并的5个常见问题
昇腾910B分布式微调实战避坑手册:5个关键环节的深度解析 当你在深夜的机房盯着屏幕上闪烁的错误日志,第八次尝试启动分布式微调任务却依然卡在SSH认证环节时,那种混合着焦虑与挫败的感受,我太熟悉了。这不是又一篇按部就班的操作手…...
基于NLP-StructBERT的智能客服语义匹配实战:Java微服务集成
基于NLP-StructBERT的智能客服语义匹配实战:Java微服务集成 你有没有遇到过这种情况?用户问“我的订单怎么还没发货”,而你的知识库里只有“订单发货状态查询”这样的标准问题。传统的关键词匹配,比如搜索“订单”和“发货”&…...
YOLO11 + SAHI + TensorRT:三剑合璧,实现高精度小目标视频实时检测的工程实践
1. 为什么需要YOLO11SAHITensorRT组合方案 在安防监控、无人机巡检等实际场景中,小目标检测一直是个令人头疼的问题。想象一下,当你站在高楼往下看,地面上的行人和车辆就像蚂蚁一样小。传统的目标检测算法在这种场景下往往表现不佳࿰…...
libiec61850开源库核心功能完全实战指南:从协议解析到电力系统通信应用
libiec61850开源库核心功能完全实战指南:从协议解析到电力系统通信应用 【免费下载链接】libiec61850 Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850 …...
Mojo加速Python科学计算:从API绑定到内存零拷贝,5步完成CUDA级性能跃迁
第一章:Mojo加速Python科学计算:从API绑定到内存零拷贝,5步完成CUDA级性能跃迁Mojo 作为兼具 Python 兼容性与系统级性能的新一代编程语言,正重塑科学计算的性能边界。其核心优势在于原生支持异构硬件(如 NVIDIA GPU&a…...
物理动力学系统的强化学习:一种替代方法
原文:towardsdatascience.com/rl-for-physical-dynamical-systems-an-alternative-approach-8e2269dc1e79?sourcecollection_archive---------1-----------------------#2024-07-28 重新引入遗传算法并与神经网络进行比较 https://medium.com/retter_42511?sourc…...
SpringAI实践(07) - 本地向量嵌入模型集成指南
SpringAI实践(07) - 本地向量嵌入模型集成指南 1.概述 本文档详细说明如何在 SpringBoot 应用中集成本地部署的 ONNX 格式向量嵌入模型(如 bge-small-zh),通过 spring-ai-starter-model-transformers 模块调用 ONNX …...
5分钟完成Axure RP中文汉化:小白也能轻松上手的终极教程
5分钟完成Axure RP中文汉化:小白也能轻松上手的终极教程 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure…...
