您当前的位置: 首页 >  c#

寒冰屋

暂无认证

  • 5浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

如何通过 C# 判断某个 IP 所属的地区?

寒冰屋 发布时间:2022-02-16 18:45:00 ,浏览量:5

咨询区
  • RC1140

如何通过 C# 判断某个 IP 所属的地区?这样我就可以方便统计。

回答区
  • Jaimes

可以借助第三方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());

    }
}

  • Vlam

有一个离线的 IP地区库,可以实现完全的离线查询,下载链接:https://lite.ip2location.com/database/ip-country

  1. 创建表并导入

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

  1. 代码查询

数据库有了,接下来就可以用 C# 查询了。

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             
关注
打赏
1665926880
查看更多评论
0.6243s