隐藏

C#开发中如何确定IP地址是否属于某个国家/地区

发布:2022/12/21 14:18:38作者:管理员 来源:本站 浏览次数:542

我如何确定特定IP地址源自使用c#的国家/地区。 我需要使用它来检查连接是否来自特定国家/地区。


您可以在项目中使用此SQL数据来确定: IP地址地理定位SQL数据库 。 下载该数据并将其导入数据库以在本地运行检查。


或者您可以使用他们的免费API返回包含国家/地区代码和国家/地区名称的XML。 您将使用您要检查的IP地址向以下URL发出请求,如下例所示:


http://ipinfodb.com/ip_query_country.php?ip=74.125.45.100

返回:

74.125.45.100 OK US United States  


只是一个简单的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());

}

}


你可以请谷歌为你做这件事。


您还可以支付以下服务:


这是一个免费的国家IP地址数据库 。


如果您不想使用像hostip.info那样的API,那么我建议订阅maxmind并在本地运行主机查找数据库。


ip2cc – 通过IP地址查找国家和俄罗斯地区Python模块,使用脚本从最新的官方数据创建数据库。


此Python实用程序会加载(尽可能频繁地)来自地区Internet注册站点( arin , ripencc , apnic , lacnic , afrinic )的最新信息,如源代码所示 :


url_template = 'ftp://ftp.ripe.net/pub/stats/%s/delegated-%s-latest' sources = {} for name in ('arin', 'ripencc', 'apnic', 'lacnic', 'afrinic'): sources[name] = url_template % (name, name)


加载数据后,可以离线并非常快速地回答查询。 可以轻松修改以直接回答原始问题,或者从命令行使用返回国家/地区所属的IP address 。


您可以使用的另一项服务是我自己的http://ipinfo.io ,它返回位置,组织和其他信息:


$ curl ipinfo.io/8.8.8.8 { "ip": "8.8.8.8", "hostname": "google-public-dns-a.google.com", "loc": "37.385999999999996,-122.0838", "org": "AS15169 Google Inc.", "city": "Mountain View", "region": "California", "country": "US", "phone": 650 }


有关更多信息,请参阅http://ipinfo.io/developers 。


以下是使用https://ipdata.co执行此操作的方法


//Common testing requirement. If you are consuming an API in a sandbox/test region, uncomment this line of code ONLY for non production uses. //System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; //Be sure to run "Install-Package Microsoft.Net.Http" from your nuget command line.

using System;

using System.Net.Http;

var baseAddress = new Uri("https://api.ipdata.co/78.8.53.5");

using (var httpClient = new HttpClient{BaseAddress = baseAddress})

{

httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "application/json");

using(var response = await httpClient.GetAsync("undefined")) {

string responseData = await response.Content.ReadAsStringAsync();

}

}


通过curl


curl https://api.ipdata.co/78.8.53.5 { "ip": "78.8.53.5", "city": "Gu0142ogu00f3w", "region": "Lower Silesia", "region_code": "DS", "country_name": "Poland", "country_code": "PL", "continent_name": "Europe", "continent_code": "EU", "latitude": 51.6461, "longitude": 16.1678, "asn": "AS12741", "organisation": "Netia SA", "postal": "67-200", "currency": "PLN", "currency_symbol": "zu0142", "calling_code": "48", "flag": "http://sofzh.miximages.com/c%23/pl.png", "emoji_flag": "ud83cuddf5ud83cuddf1", "time_zone": "Europe/Warsaw", "is_eu": true, "suspicious_factors": { "is_tor": false } }⏎


对于脱机数据库,您可以获得免费的IP2Location LITE DB1


要创建表


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


对于FMT文件


10.0 5 1 SQLCHAR 0 1 """ 0 first_double_quote Latin1_General_CI_AI 2 SQLCHAR 0 20 "","" 1 ip_from "" 3 SQLCHAR 0 20 "","" 2 ip_to "" 4 SQLCHAR 0 2 "","" 3 country_code Latin1_General_CI_AI 5 SQLCHAR 0 64 ""rn" 4 country_name Latin1_General_CI_AI


FMT代码的第一行表示bcp的版本。 请根据您安装的MS-SQL更改版本。


SQL Server 2016 12.0


SQL Server 2014 12.0


SQL Server 2012 11.0


SQL Server 2008/2008 R2 10.0


SQL Server 2005 9.0


SQL Server 2000 8.0


SQL Server 7.0 7.0


SQL Server 6.5 6.5


用于查询MSSQL的C#代码


上述就是C#学习教程:如何确定IP地址是否属于某个国家/地区分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)


using System.Data.SqlClient;

using System.Numerics;

using System.Net;

using System.Text;

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) + "rn"))));

 }

 }

}

reader.Close();

MsgBox(sb.ToString());

 }

}

private void LittleEndian(ref byte[] byteArr) {

if (BitConverter.IsLittleEndian) {

 List byteList = new List(byteArr);

 byteList.Reverse();

byteArr = byteList.ToArray();

}

 }

}