如何确定IP地址是否属于某个国家/地区

我如何确定特定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注册站点( arinripenccapniclacnicafrinic )的最新信息,如源代码所示 :

 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": "G\u0142og\u00f3w", "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": "z\u0142", "calling_code": "48", "flag": "http://sofzh.miximages.com/c%23/pl.png", "emoji_flag": "\ud83c\uddf5\ud83c\uddf1", "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 "\"\r\n" 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#代码

 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) + "\r\n")))); } } } reader.Close(); MsgBox(sb.ToString()); } } private void LittleEndian(ref byte[] byteArr) { if (BitConverter.IsLittleEndian) { List byteList = new List(byteArr); byteList.Reverse(); byteArr = byteList.ToArray(); } } }