C# 如何判断一个IP地址是否属于一个国家
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1270091/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to determine if an IP address belongs to a country
提问by RC1140
How would i determine the country that a spcific IP address is originating from using c#. I need to use this to check if connections originate from a specific country.
我将如何确定特定 IP 地址源自使用 c# 的国家/地区。我需要使用它来检查连接是否来自特定国家/地区。
采纳答案by Ron
You can use this SQL data in your project to determine that: IP address geolocation SQL database. Download that data and import it into your database to run checks locally.
您可以在您的项目中使用此 SQL 数据来确定:IP 地址地理定位 SQL 数据库。下载该数据并将其导入您的数据库以在本地运行检查。
Or you can use their free API that returns XML containing the country code and country name. You'd make a request to the following URL with the IP address you wanted to check, as seen in this example:
或者您可以使用他们的免费 API 返回包含国家代码和国家名称的 XML。您将使用要检查的 IP 地址向以下 URL 发出请求,如下例所示:
http://ipinfodb.com/ip_query_country.php?ip=74.125.45.100
http://ipinfodb.com/ip_query_country.php?ip=74.125.45.100
Returns:
返回:
<Response>
<Ip>74.125.45.100</Ip>
<Status>OK</Status>
<CountryCode>US</CountryCode>
<CountryName>United States</CountryName>
</Response>
回答by michael pearson
If you don't want to use an API like perhaps hostip.info, then I'd suggest subscribing to maxmind and running a host lookup database locally.
如果您不想使用像 hostip.info 这样的 API,那么我建议您订阅 maxmind 并在本地运行主机查找数据库。
回答by YetAnotherDeveloper
you can ask google to do it for you.
你可以要求谷歌为你做。
there are also services that you can pay for you want:
您还可以支付所需的费用:
回答by JP Alioto
Here is a free IP Address to Country database.
这是一个免费的IP 地址到国家/地区数据库。
回答by gimel
ip2cc- Lookup country and Russia region by IP address Python module with script to create database from up-to-date official data.
ip2cc- 按 IP 地址查找国家和俄罗斯地区的 Python 模块,带有脚本,可根据最新的官方数据创建数据库。
This Python
utility loads (as frequently as you like) up-to-date information from Regional Internet Registrysites (arin
, ripencc
, apnic
, lacnic
, afrinic
), as shown in the source:
此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)
Once the data is loaded, queries can be answered offlineand very quickly.
Can be easily modified to directly answer the original question, or used from the command line to return the country an IP address
belongs to.
加载数据后,可以非常快速地离线回答查询。可以轻松修改以直接回答原始问题,或从命令行使用以返回IP address
所属国家/地区。
回答by Ben Dowling
Another service you could use is my own, http://ipinfo.io, which returns location, organization and other information:
您可以使用的另一个服务是我自己的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
}
See http://ipinfo.io/developersfor more information.
有关更多信息,请参阅http://ipinfo.io/developers。
回答by Jaimes
Just a simple APIcall e.g. https://ipapi.co/8.8.8.8/country/
只是一个简单的API调用,例如https://ipapi.co/8.8.8.8/country/
US
我们
Here's a C# example with working fiddle:
这是一个带有工作小提琴的 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());
}
}
回答by Jonathan
Here's how to do this with https://ipdata.co
这是使用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();
}
}
Via 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": "https://ipdata.co/flags/pl.png",
"emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
"time_zone": "Europe/Warsaw",
"is_eu": true,
"suspicious_factors": {
"is_tor": false
}
}?
回答by Vlam
For offline database, you can get the free IP2Location LITE DB1
对于离线数据库,您可以获得免费的IP2Location LITE DB1
To create the table
创建表
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
To import the data
导入数据
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
For the FMT file
对于 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
The first line of the FMT code indicates the version of bcp. Please change the version as according to your MS-SQL installed.
FMT 代码的第一行表示 bcp 的版本。请根据您安装的 MS-SQL 更改版本。
SQL Server 2016 12.0
SQL Server 2016 12.0
SQL Server 2014 12.0
SQL Server 2014 12.0
SQL Server 2012 11.0
SQL Server 2012 11.0
SQL Server 2008/2008 R2 10.0
SQL Server 2008/2008 R2 10.0
SQL Server 2005 9.0
SQL Server 2005 9.0
SQL Server 2000 8.0
SQL Server 2000 8.0
SQL Server 7.0 7.0
SQL Server 7.0 7.0
SQL Server 6.5 6.5
SQL Server 6.5 6.5
C# code to query MSSQL
用于查询 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<byte> byteList = new List<byte>(byteArr);
byteList.Reverse();
byteArr = byteList.ToArray();
}
}
}
回答by nag
You can easily do this using an IP Geolocation API
您可以使用IP 地理定位 API轻松完成此操作
It will return the country, state, city, timezone, and postal code. Also, visit https://geo.ipify.org/docsand try for free. Let me know how it goes.
它将返回国家、州、城市、时区和邮政编码。此外,请访问https://geo.ipify.org/docs并免费试用。让我知道事情的后续。