Пример #1
0
        /// <summary>
        /// Download the dedicated server list from the <see cref="RepoConstants.DedicatedServersListUrl"/> and return the ones that are correctly written
        /// </summary>
        public static async Task RefreshDedicatedServersList()
        {
            while (MasterServer.RunServer)
            {
                try
                {
                    ServicePointManager.ServerCertificateValidationCallback = GithubCertification.MyRemoteCertificateValidationCallback;
                    using (var client = new WebClient())
                        using (var stream = client.OpenRead(RepoConstants.DedicatedServersListUrl))
                        {
                            using (var reader = new StreamReader(stream))
                            {
                                var content = await reader.ReadToEndAsync().ConfigureAwait(false);

                                var servers = content
                                              .Trim()
                                              .Split('\n')
                                              .Where(s => !s.StartsWith("#") && s.Contains(":") && !string.IsNullOrEmpty(s))
                                              .ToArray();

                                DedicatedServers.Clear();

                                foreach (var server in servers)
                                {
                                    try
                                    {
                                        DedicatedServers.Add(LunaNetUtils.CreateEndpointFromString(server));
                                    }
                                    catch (Exception)
                                    {
                                        //Ignore the bad server
                                    }
                                }
                            }
                        }
                }
                catch (Exception)
                {
                    //Ignored
                }

                await Task.Delay(RequestInterval).ConfigureAwait(false);
            }
        }
Пример #2
0
        private static void RefreshMasterServersList()
        {
            try
            {
                ServicePointManager.ServerCertificateValidationCallback = GithubCertification.MyRemoteCertificateValidationCallback;
                using (var client = new WebClient())
                    using (var stream = client.OpenRead(RepoConstants.MasterServersListUrl))
                    {
                        using (var reader = new StreamReader(stream))
                        {
                            var content = reader.ReadToEnd();
                            var servers = content
                                          .Trim()
                                          .Split('\n')
                                          .Where(s => !s.StartsWith("#") && s.Contains(":") && !string.IsNullOrEmpty(s))
                                          .ToArray();

                            MasterServersEndpoints.Clear();

                            foreach (var server in servers)
                            {
                                try
                                {
                                    MasterServersEndpoints.Add(LunaNetUtils.CreateEndpointFromString(server));
                                }
                                catch (Exception)
                                {
                                    //Ignore the bad server
                                }
                            }
                        }
                    }
            }
            catch (Exception)
            {
                //Ignored
            }
        }
Пример #3
0
        /// <summary>
        /// Sends the network message. It will skip client messages to send when we are not connected,
        /// except if it's directed at master servers, then it will start the NetClient and socket.
        /// </summary>
        private static void SendNetworkMessage(IMessageBase message)
        {
            message.Data.SentTime = LunaNetworkTime.UtcNow.Ticks;
            try
            {
                if (message is IMasterServerMessageBase)
                {
                    if (NetworkMain.ClientConnection.Status == NetPeerStatus.NotRunning)
                    {
                        LunaLog.Log("Starting client to send unconnected message");
                        NetworkMain.ClientConnection.Start();
                    }
                    while (NetworkMain.ClientConnection.Status != NetPeerStatus.Running)
                    {
                        LunaLog.Log("Waiting for client to start up to send unconnected message");
                        // Still trying to start up
                        Thread.Sleep(50);
                    }

                    IPEndPoint[] masterServers;
                    if (string.IsNullOrEmpty(SettingsSystem.CurrentSettings.CustomMasterServer))
                    {
                        masterServers = MasterServerRetriever.MasterServers.GetValues;
                    }
                    else
                    {
                        masterServers = new[]
                        {
                            LunaNetUtils.CreateEndpointFromString(SettingsSystem.CurrentSettings.CustomMasterServer)
                        };
                    }
                    foreach (var masterServer in masterServers)
                    {
                        // Don't reuse lidgren messages, it does that on it's own
                        var lidgrenMsg = NetworkMain.ClientConnection.CreateMessage(message.GetMessageSize());

                        message.Serialize(lidgrenMsg);
                        NetworkMain.ClientConnection.SendUnconnectedMessage(lidgrenMsg, masterServer);
                    }
                    // Force send of packets
                    NetworkMain.ClientConnection.FlushSendQueue();
                }
                else
                {
                    if (NetworkMain.ClientConnection == null || NetworkMain.ClientConnection.Status == NetPeerStatus.NotRunning ||
                        MainSystem.NetworkState < ClientState.Connected)
                    {
                        return;
                    }
                    var lidgrenMsg = NetworkMain.ClientConnection.CreateMessage(message.GetMessageSize());

                    message.Serialize(lidgrenMsg);
                    NetworkMain.ClientConnection.SendMessage(lidgrenMsg, message.NetDeliveryMethod, message.Channel);
                    // Force send of packets
                    NetworkMain.ClientConnection.FlushSendQueue();
                }

                message.Recycle();
            }
            catch (Exception e)
            {
                NetworkMain.HandleDisconnectException(e);
            }
        }
Пример #4
0
        public static async void RegisterWithMasterServer()
        {
            if (!MasterServerSettings.SettingsStore.RegisterWithMasterServer)
            {
                return;
            }

            LunaLog.Normal("Registering with master servers");

            var adr4 = LunaNetUtils.GetOwnInternalIPv4Address();

            // As of right now the internal endpoint for IPv4 is mandatory, because if there is none, there is no
            // IPv4 connectivity at all, which is required to connect to the master servers (so they can determine
            // the public IPv4 address).
            if (adr4 == null)
            {
                return;
            }
            var endpoint4 = new IPEndPoint(adr4, ServerContext.Config.Port);
            // Only send IPv6 address if actually listening on IPv6, otherwise send loopback with means "none".
            IPAddress  adr6;
            IPEndPoint endpoint6;

            if (LidgrenServer.Server.Socket.AddressFamily == AddressFamily.InterNetworkV6)
            {
                adr6      = LunaNetUtils.GetOwnInternalIPv6Address();
                endpoint6 = new IPEndPoint(adr6, ServerContext.Config.Port);
            }
            else
            {
                endpoint6 = new IPEndPoint(IPAddress.IPv6Loopback, ServerContext.Config.Port);
            }

            while (ServerContext.ServerRunning)
            {
                var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <MsRegisterServerMsgData>();
                msgData.Id                = LidgrenServer.Server.UniqueIdentifier;
                msgData.Password          = !string.IsNullOrEmpty(GeneralSettings.SettingsStore.Password);
                msgData.Cheats            = GeneralSettings.SettingsStore.Cheats;
                msgData.Description       = GeneralSettings.SettingsStore.Description;
                msgData.CountryCode       = GeneralSettings.SettingsStore.CountryCode;
                msgData.Website           = GeneralSettings.SettingsStore.Website;
                msgData.WebsiteText       = GeneralSettings.SettingsStore.WebsiteText;
                msgData.RainbowEffect     = DedicatedServerSettings.SettingsStore.UseRainbowEffect;
                msgData.Color             = new[] { DedicatedServerSettings.SettingsStore.Red, DedicatedServerSettings.SettingsStore.Green, DedicatedServerSettings.SettingsStore.Blue };
                msgData.GameMode          = (int)GeneralSettings.SettingsStore.GameMode;
                msgData.InternalEndpoint  = endpoint4;
                msgData.InternalEndpoint6 = endpoint6;
                msgData.MaxPlayers        = GeneralSettings.SettingsStore.MaxPlayers;
                msgData.ModControl        = GeneralSettings.SettingsStore.ModControl;
                msgData.PlayerCount       = ServerContext.Clients.Count;
                msgData.ServerName        = GeneralSettings.SettingsStore.ServerName;
                msgData.ServerVersion     = LmpVersioning.CurrentVersion.ToString(3);
                msgData.VesselPositionUpdatesMsInterval          = IntervalSettings.SettingsStore.VesselUpdatesMsInterval;
                msgData.SecondaryVesselPositionUpdatesMsInterval = IntervalSettings.SettingsStore.SecondaryVesselUpdatesMsInterval;
                msgData.WarpMode       = (int)WarpSettings.SettingsStore.WarpMode;
                msgData.TerrainQuality = (int)GeneralSettings.SettingsStore.TerrainQuality;

                msgData.Description = msgData.Description.Length > 200 ? msgData.Description.Substring(0, 200) : msgData.Description;
                msgData.CountryCode = msgData.CountryCode.Length > 2 ? msgData.CountryCode.Substring(0, 2) : msgData.CountryCode;
                msgData.Website     = msgData.Website.Length > 60 ? msgData.Website.Substring(0, 60) : msgData.Website;
                msgData.WebsiteText = msgData.WebsiteText.Length > 15 ? msgData.WebsiteText.Substring(0, 15) : msgData.WebsiteText;
                msgData.ServerName  = msgData.ServerName.Length > 30 ? msgData.ServerName.Substring(0, 30) : msgData.ServerName;

                IPEndPoint[] masterServers;
                if (string.IsNullOrEmpty(DebugSettings.SettingsStore.CustomMasterServer))
                {
                    masterServers = MasterServerRetriever.MasterServers.GetValues;
                }
                else
                {
                    masterServers = new[]
                    {
                        LunaNetUtils.CreateEndpointFromString(DebugSettings.SettingsStore.CustomMasterServer)
                    };
                }
                foreach (var masterServer in masterServers)
                {
                    RegisterWithMasterServer(msgData, masterServer);
                }

                await Task.Delay(MasterServerRegistrationMsInterval);
            }
        }