如何通过C判断某个IP所属的地区?
咨询区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创建表并导入 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 代码查询
数据库有了,接下来就可以用 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 <= (reader.FieldCount() - 1)); x++) { sb.Append((reader.GetName(x) + (": " + (reader.GetValue(x) + "r ")))); } } } reader.Close(); MsgBox(sb.ToString()); } } private void LittleEndian(ref byte[] byteArr) { if (BitConverter.IsLittleEndian) { List byteList = new List(byteArr); byteList.Reverse(); byteArr = byteList.ToArray(); } } } 点评区
没想到还有离线版本的 IP地址库 ,这个不错,学习了。
文章来源于NET技术问答 ,作者Stackoverflow