コード例 #1
0
        /// <summary>
        /// Chooses a server from the selected server city according to server weights.
        /// </summary>
        /// <param name="serverCityItem">Selected server city for connection.</param>
        /// <returns>VPN server selected for connection.</returns>
        public VPNServer SelectServer(Models.CityServerListItem serverCityItem)
        {
            var city = serverCityItem.City;

            Dictionary <int, VPNServer> servers = new Dictionary <int, VPNServer>();

            servers = GetServerItems().Where(x => x.Value.City == city).ToDictionary(x => x.Key, x => x.Value);

            var weightSum = servers.Sum(server => server.Value.Weight);

            Random rand = new Random();
            int    r    = rand.Next(0, weightSum + 1);

            VPNServer serverSelection = new VPNServer();

            foreach (var server in servers)
            {
                r -= server.Value.Weight;
                if (r <= 0)
                {
                    serverSelection = server.Value;
                    break;
                }
            }

            return(serverSelection);
        }
コード例 #2
0
        /// <summary>
        /// Loads the server list from a file.
        /// </summary>
        /// <param name="filePath">Path of the file containing the server list.</param>
        public void LoadServerDataFromFile(string filePath)
        {
            string jsonStringData = string.Empty;

            JSONStructures.ServerList servers;

            try
            {
                jsonStringData = File.ReadAllText(filePath);
                JObject jObjectServerData = JObject.Parse(jsonStringData);
                servers = JsonConvert.DeserializeObject <JSONStructures.ServerList>(jObjectServerData.ToString());
            }
            catch (Exception)
            {
                return;
            }

            var newVPNServers = new Dictionary <int, VPNServer>();

            var serverIndex = 0;

            foreach (var country in servers.Countries)
            {
                foreach (var city in country.Cities)
                {
                    try
                    {
                        foreach (var server in city.Servers)
                        {
                            var portRanges = new List <List <int> > {
                                new List <int> {
                                    53, 53
                                }
                            };
                            try
                            {
                                portRanges = new List <List <int> >();

                                // Port range parsing
                                foreach (var portRange in server.PortRanges)
                                {
                                    portRanges.Add(new List <int> {
                                        portRange.First(), portRange.Last()
                                    });
                                }
                            }
                            catch (Exception e)
                            {
                                ErrorHandling.ErrorHandler.Handle(e, ErrorHandling.LogLevel.Debug);
                            }

                            var newVPNServer = new VPNServer
                            {
                                IPv4Address      = server.IPv4Gateway,
                                IPv6Address      = server.IPv6Gateway,
                                Endpoint         = server.IPv4EndpointAddress,
                                DNSServerAddress = server.IPv4Gateway,
                                Ports            = portRanges,
                                PublicKey        = server.PublicKey,
                                Weight           = server.Weight,
                                Name             = server.Hostname,
                                Country          = country.Name,
                                City             = city.Name,
                            };

                            newVPNServers[serverIndex] = newVPNServer;
                            serverIndex++;
                        }
                    }
                    catch (NullReferenceException)
                    {
                        continue;
                    }
                }
            }

            // Sort the server list
            newVPNServers = SortServerList(newVPNServers);
            List <Models.CityServerListItem> newServerData = new List <Models.CityServerListItem>();

            var groupedServersByCity = newVPNServers.GroupBy(s => s.Value.City).ToDictionary(grp => grp.Key, grp => grp.ToList());

            foreach (var serverCity in groupedServersByCity)
            {
                List <Models.ServerListItem> cityServers = new List <Models.ServerListItem>();

                for (int i = 0; i < serverCity.Value.Count; i++)
                {
                    cityServers.Add(new Models.ServerListItem
                    {
                        Country  = serverCity.Value[i].Value.Country,
                        City     = serverCity.Value[i].Value.City,
                        Name     = serverCity.Value.Count > 1 ? string.Format("{0} {1}", serverCity.Value[i].Value.City, i + 1) : serverCity.Value[i].Value.City,
                        Code     = serverCity.Value[i].Value.Name,
                        Endpoint = serverCity.Value[i].Value.Endpoint,
                    });
                }

                newServerData.Add(new Models.CityServerListItem
                {
                    Country = serverCity.Value[0].Value.Country,
                    City    = serverCity.Key,
                    Servers = cityServers,
                });
            }

            serverCityData = newServerData;
            vpnServers     = newVPNServers;
        }