/// <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); } }
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 } }
/// <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); } }
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); } }