C# 如何确定IP地址是否属于某个国家/地区
我如何使用c来确定特定IP地址来自哪个国家。我需要使用它来检查连接是否来自特定国家。您可以在项目中使用此SQL数据来确定:。下载该数据并将其导入数据库以在本地运行检查 或者您可以使用他们的免费API返回包含国家代码和国家名称的XML。您可以使用要检查的IP地址向以下URL发出请求,如本例所示: 返回:C# 如何确定IP地址是否属于某个国家/地区,c#,.net,geolocation,C#,.net,Geolocation,我如何使用c来确定特定IP地址来自哪个国家。我需要使用它来检查连接是否来自特定国家。您可以在项目中使用此SQL数据来确定:。下载该数据并将其导入数据库以在本地运行检查 或者您可以使用他们的免费API返回包含国家代码和国家名称的XML。您可以使用要检查的IP地址向以下URL发出请求,如本例所示: 返回: <Response> <Ip>74.125.45.100</Ip> <Status>OK</Status> <CountryCod
<Response>
<Ip>74.125.45.100</Ip>
<Status>OK</Status>
<CountryCode>US</CountryCode>
<CountryName>United States</CountryName>
</Response>
如果你不想使用像hostip.info这样的API,那么我建议订阅maxmind并在本地运行主机查找数据库。你可以让谷歌帮你做 还有一些服务,您可以根据自己的需要付费: 这里是一个免费的。-Lookup country and Russia region by IP address Python模块,该模块使用脚本从最新的官方数据创建数据库 此Python实用程序根据您的喜好频繁加载来自arin、RIMECC、apnic、lacnic、afrinic站点的最新信息,如下所示: 一旦加载了数据,查询就可以离线快速回答。
可以轻松修改以直接回答原始问题,也可以从命令行返回IP地址所属的国家。您可以使用的另一个服务是my own,它返回位置、组织和其他信息:
$ 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
}
有关更多信息,请参阅。只需一个简单的电话,例如
美国
下面是一个C示例:
下面是如何使用 过孔旋度
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
}
}⏎
对于离线数据库,您可以免费获得 创建表的步骤
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<byte> byteList = new List<byte>(byteArr);
byteList.Reverse();
byteArr = byteList.ToArray();
}
}
}
您可以使用
它将返回国家、州、城市、时区和邮政编码。此外,免费访问和尝试。让我知道它是如何运行的。您可以使用 在C中: 卷曲: 卷曲
我需要的数据是可用的离线,因为它将用于统计数据。因此,我将使用sql选项。请注意,IP分配偶尔会更改。所以记得偶尔更新一下你的数据库。你需要更新的频率取决于你在做什么;对于简单的统计数据,你可以决定每年更新一次。这已经改变了:你现在必须免费注册才能使用他们的API。请看这里:这似乎已经改变,因为,该网站现在有一个链接在主导航最终导致以下下载:归属要求,但免费的商业用途。此处的其他信息,即IP必须转换为INT:
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
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
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();
}
}
}
var url = "https://api.astroip.co/70.167.7.1/?api_key=1725e47c-1486-4369-aaff-463cc9764026";
using (var httpClient = new HttpClient())
using(var resp = await httpClient.GetAsync(url))
{
string resp = await resp.Content.ReadAsStringAsync();
}
{
"status_code": 200,
"geo": {
"is_metric": false,
"is_eu": false,
"longitude": -97.822,
"latitude": 37.751,
"country_geo_id": 6252001,
"zip_code": null,
"city": null,
"region_code": null,
"region_name": null,
"continent_code": "NA",
"continent_name": "North America",
"capital": "Washington",
"country_name": "United States",
"country_code": "US"
},
"asn": {
"route": "70.167.6.0/23",
"type": "isp",
"domain": "cox.net",
"organization": "ASN-CXA-ALL-CCI-22773-RDC",
"asn": "AS22773"
},
"currency": {
"native_name": "US Dollar",
"code": "USD",
"name": "US Dollar",
"symbol": "$"
},
"timezone": {
"is_dst": false,
"gmt_offset": -21600,
"date_time": "2020-11-23T15:15:56-06:00",
"microsoft_name": "Central Standard Time",
"iana_name": "America/Chicago"
},
"security": {
"is_crawler": false,
"is_proxy": false,
"is_tor": false,
"tor_insights": null,
"proxy_insights": null,
"crawler_insights": null
},
"crypto": null,
"user_agent": null,
"error": null,
"hostname": "wsip-70-167-7-1.sd.sd.cox.net",
"ip_type": "ipv4",
"ip": "70.167.7.1"
}