How to determine if an IP address belongs to a country

前端 未结 11 1141
情歌与酒
情歌与酒 2020-12-07 17:55

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.

相关标签:
11条回答
  • 2020-12-07 18:27

    Here's how to do this with 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
        }
    }⏎ 
    
    0 讨论(0)
  • 2020-12-07 18:29

    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.

    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:

    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>
    
    0 讨论(0)
  • 2020-12-07 18:34

    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.

    0 讨论(0)
  • 2020-12-07 18:35

    Just a simple API call e.g. https://ipapi.co/8.8.8.8/country/

    US

    Here's a C# example with working fiddle :

    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());
    
        }
    }
    
    0 讨论(0)
  • 2020-12-07 18:37

    For offline database, you can get the free 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

    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.

    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

    C# code to query MSSQL

    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();
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-07 18:40

    Another service you could use is my own, http://ipinfo.io, which returns location, organization and other information:

    $ 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/developers for more information.

    0 讨论(0)
提交回复
热议问题