zoukankan      html  css  js  c++  java
  • 17monipdb根据IP获得区域

    https://www.ipip.net/download.html

    https://github.com/17mon/csharp

     

    IpAndPositionHelper
    
      public class IpAndPositionHelper
        {
            #region Resource
            public static bool EnableFileWatch = false;
    
            private static int offset;
            private static uint[] index = new uint[256];
            private static byte[] dataBuffer;
            private static byte[] indexBuffer;
            private static long lastModifyTime = 0L;
            private static string ipFile;
            private static readonly object @lock = new object();
            #endregion
    
            #region LoadDat
            public static void Load(string filename)
            {
                ipFile = new FileInfo(filename).FullName;
                Load();
                if (EnableFileWatch)
                {
                    Watch();
                }
            }
    
            private static void Load()
            {
                lock (@lock)
                {
                    var file = new FileInfo(ipFile);
                    lastModifyTime = file.LastWriteTime.Ticks;
                    try
                    {
                        dataBuffer = new byte[file.Length];
                        using (var fin = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
                        {
                            fin.Read(dataBuffer, 0, dataBuffer.Length);
                        }
    
                        var indexLength = BytesToLong(dataBuffer[0], dataBuffer[1], dataBuffer[2], dataBuffer[3]);
                        indexBuffer = new byte[indexLength];
                        Array.Copy(dataBuffer, 4, indexBuffer, 0, indexLength);
                        offset = (int)indexLength;
    
                        for (var loop = 0; loop < 256; loop++)
                        {
                            index[loop] = BytesToLong(indexBuffer[loop * 4 + 3], indexBuffer[loop * 4 + 2],
                                indexBuffer[loop * 4 + 1],
                                indexBuffer[loop * 4]);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
    
            private static uint BytesToLong(byte a, byte b, byte c, byte d)
            {
                return ((uint)a << 24) | ((uint)b << 16) | ((uint)c << 8) | d;
            }
    
            private static void Watch()
            {
                var file = new FileInfo(ipFile);
                if (file.DirectoryName == null) return;
                var watcher = new FileSystemWatcher(file.DirectoryName, file.Name) { NotifyFilter = NotifyFilters.LastWrite };
                watcher.Changed += (s, e) =>
                {
                    var time = File.GetLastWriteTime(ipFile).Ticks;
                    if (time > lastModifyTime)
                    {
                        Load();
                    }
                };
                watcher.EnableRaisingEvents = true;
            }
            #endregion
    
            #region FindIP
            public static string[] Find(string ip)
            {
                lock (@lock)
                {
                    var ips = ip.Split('.');
                    var ip_prefix_value = int.Parse(ips[0]);
                    long ip2long_value = BytesToLong(byte.Parse(ips[0]), byte.Parse(ips[1]), byte.Parse(ips[2]),
                        byte.Parse(ips[3]));
                    var start = index[ip_prefix_value];
                    var max_comp_len = offset - 1028;
                    long index_offset = -1;
                    var index_length = -1;
                    byte b = 0;
                    for (start = start * 8 + 1024; start < max_comp_len; start += 8)
                    {
                        if (
                            BytesToLong(indexBuffer[start + 0], indexBuffer[start + 1], indexBuffer[start + 2],
                                indexBuffer[start + 3]) >= ip2long_value)
                        {
                            index_offset = BytesToLong(b, indexBuffer[start + 6], indexBuffer[start + 5],
                                indexBuffer[start + 4]);
                            index_length = 0xFF & indexBuffer[start + 7];
                            break;
                        }
                    }
                    var areaBytes = new byte[index_length];
                    Array.Copy(dataBuffer, offset + (int)index_offset - 1024, areaBytes, 0, index_length);
                    return Encoding.UTF8.GetString(areaBytes).Split('	');
                }
            }
            #endregion
        }
            [TestMethod()]
            public void FindTest()
            {
                IpAndPositionHelper.EnableFileWatch = true; // 默认值为:false,如果为true将会检查ip库文件的变化自动reload数据
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "APP_Data\tinyipdata_utf8.dat");  //合并目录
                IpAndPositionHelper.Load(path);//加载
    
                var infos = IpAndPositionHelper.Find("180.169.67.130");//查询
    
                var result = string.Join("-", infos).TrimEnd('-');      //中国-上海
    
            }

     

    附IP解析文件:

    17monipdb4ecdz.zip

     

  • 相关阅读:
    King's Quest
    Prince and Princess
    Strongly connected
    线性渐变--linear-gradient
    镜像渐变-radio-gradient
    宽度自适应-左右
    宽度自适应-左中右
    HTML5 视频规范简介
    SVG格式
    Html5新标签解释及用法
  • 原文地址:https://www.cnblogs.com/shy1766IT/p/8651753.html
Copyright © 2011-2022 走看看