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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 14:29:33  来源:igfitidea点击:

How to determine if an IP address belongs to a country

c#.netgeolocation

提问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

回答by JP Alioto

回答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 Pythonutility 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 注册站点 ( 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)

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 addressbelongs 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并免费试用。让我知道事情的后续。