示例#1
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="pathBlocksIp">Ruta de bloques ip</param>
        /// <param name="pathLocations">Ruta de posiciones</param>
        public GeoLite2LocationProvider(string pathBlocksIp, string pathLocations)
        {
            if (File.Exists(pathBlocksIp) && File.Exists(pathLocations))
            {
                Dictionary <long, GeoLocateResult> data = new Dictionary <long, GeoLocateResult>();

                using (Stream fs = CompressHelper.UnGzFile(pathLocations))
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        Parallel.ForEach <string>(LineGenerator(sr), line =>
                        {
                            string[] sp = line.Split(',');
                            if (sp.Length <= 0)
                            {
                                return;
                            }

                            long c;
                            if (long.TryParse(sp[0], out c))
                            {
                                switch (sp.Length)
                                {
                                case 6:
                                    {
                                        // Archivo de paises
                                        GeoLocateResult add = new GeoLocateResult(sp[2] + "-" + sp[4], (string.IsNullOrEmpty(sp[3]) ? "" : sp[3] + " - ") + sp[5]);
                                        lock (data) data.Add(c, add);
                                        break;
                                    }

                                case 13:
                                    {
                                        // Archivo de paises y poblaciones
                                        GeoLocateResult add = new GeoLocateResult(sp[2] + "-" + sp[4], (string.IsNullOrEmpty(sp[12]) ? "" : sp[12] + " - ") + sp[5]);
                                        lock (data) data.Add(c, add);
                                        break;
                                    }
                                }
                            }
                        }
                                                  );
                    }

                List <geoIp> l = new List <geoIp>();
                using (Stream fs = CompressHelper.UnGzFile(pathBlocksIp))
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        Parallel.ForEach <string>(LineGenerator(sr), line =>
                        {
                            string[] sp = line.Split(',');
                            // El archivo grande y pequeño están organizados igual
                            if (sp.Length != 10 && sp.Length != 6)
                            {
                                return;
                            }

                            long c;
                            GeoLocateResult r;
                            if (long.TryParse(sp[2], out c) && data.TryGetValue(c, out r))
                            {
                                IPNetwork net;
                                if (IPNetwork.TryParse(sp[0], out net))
                                {
                                    geoIp add = new geoIp(net, r);
                                    lock (l) l.Add(add);
                                }
                            }
                        }
                                                  );
                    }
                _Locates = l.ToArray();
            }
        }
示例#2
0
 public geoIp(IPNetwork network, GeoLocateResult data)
 {
     Network = network;
     Result  = data;
 }