如何通过 C# 判断某个 IP 所属的地区?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过 C# 判断某个 IP 所属的地区?相关的知识,希望对你有一定的参考价值。
咨询区
RC1140
如何通过 C# 判断某个 IP 所属的地区?这样我就可以方便统计。
回答区
Jaimes
可以借助第三方API接口,参考网址:https://ipapi.co/8.8.8.8/country/
, C# 代码如下:
using System;
using System.Net;
using System.IO;
using System.Text;
public class Program
public static void Main()
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://ipapi.co/8.8.8.8/country/");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
var reader = new System.IO.StreamReader(response.GetResponseStream(), ASCIIEncoding.ASCII);
Console.WriteLine(reader.ReadToEnd());
Vlam
有一个离线的 IP地区库
,可以实现完全的离线查询,下载链接:https://lite.ip2location.com/database/ip-country
创建表并导入
CREATE DATABASE ip2location
GO
USE ip2location
GO
CREATE TABLE [ip2location].[dbo].[ip2location_db1](
[ip_from] float NOT NULL,
[ip_to] float NOT NULL,
[country_code] nvarchar(2) NOT NULL,
[country_name] nvarchar(64) NOT NULL,
) ON [PRIMARY]
GO
CREATE INDEX [ip_from] ON [ip2location].[dbo].[ip2location_db1]([ip_from]) ON [PRIMARY]
GO
CREATE INDEX [ip_to] ON [ip2location].[dbo].[ip2location_db1]([ip_to]) ON [PRIMARY]
GO
BULK INSERT [ip2location].[dbo].[ip2location_db1]
FROM 'C:\\[path to your CSV file]\\IP2LOCATION-LITE-DB1.CSV'
WITH
(
FORMATFILE = 'C:\\[path to your DB1.FMT file]\\DB1.FMT'
)
GO
代码查询
数据库有了,接下来就可以用 C# 查询了。
public class Form1
private void Form1_Load(object sender, System.EventArgs e)
string ip = "8.8.8.8";
this.IP2Location(ip);
private void IP2Location(string myip)
IPAddress address = null;
if (IPAddress.TryParse(myip, address))
byte[] addrBytes = address.GetAddressBytes();
this.LittleEndian(addrBytes);
UInt32 ipno = 0;
ipno = BitConverter.ToUInt32(addrBytes, 0);
string sql = "SELECT TOP 1 * FROM ip2location_db1 WHERE ip_to >= \\'" + ipno.ToString() + "\\'";
object conn = new SqlConnection("Server=yourserver;Database=yourdatabase;User Id=youruserid;Password=yourpassword;");
object comm = new SqlCommand(sql, conn);
SqlDataReader reader;
comm.Connection.Open();
reader = comm.ExecuteReader(CommandBehavior.CloseConnection);
int x = 0;
object sb = new StringBuilder(250);
if (reader.HasRows)
if (reader.Read())
for (x = 0; (x <= (reader.FieldCount() - 1)); x++)
sb.Append((reader.GetName(x) + (": " + (reader.GetValue(x) + "\\r\\n"))));
reader.Close();
MsgBox(sb.ToString());
private void LittleEndian(ref byte[] byteArr)
if (BitConverter.IsLittleEndian)
List<byte> byteList = new List<byte>(byteArr);
byteList.Reverse();
byteArr = byteList.ToArray();
点评区
没想到还有离线版本的 IP地址库
,这个不错,学习了。
以上是关于如何通过 C# 判断某个 IP 所属的地区?的主要内容,如果未能解决你的问题,请参考以下文章