/// <summary> /// Starts the web server /// </summary> public static void StartWebServer() { if (WebsiteSettings.SettingsStore.EnableWebsite) { try { if (!LunaNetUtils.IsTcpPortInUse(WebsiteSettings.SettingsStore.Port)) { Server.Use(new TcpListenerAdapter(new TcpListener(IPAddress.Any, WebsiteSettings.SettingsStore.Port))); Server.Use(new ExceptionHandler()); Server.Use(new CompressionHandler(DeflateCompressor.Default, GZipCompressor.Default)); Server.Use(new FileHandler()); Server.Use(new HttpRouter().With(string.Empty, new RestHandler <ServerInformation>(new ServerInformationRestController(), JsonResponseProvider.Default))); Server.Start(); } else { LunaLog.Error("Could not start web server. Port is already in use."); LunaLog.Info("You can change the web server settings inside 'Config/WebsiteSettings.xml'"); } } catch (Exception e) { LunaLog.Error($"Could not start web server. Details: {e}"); } } }
public static async void Start() { var config = new NetPeerConfiguration("masterserver") { Port = Port, SuppressUnreliableUnorderedAcks = true, PingInterval = 500, ConnectionTimeout = ServerMsTimeout }; config.EnableMessageType(NetIncomingMessageType.UnconnectedData); var peer = new NetServer(config); peer.Start(); CheckMasterServerListed(); LunaLog.Info($"Master server {LmpVersioning.CurrentVersion} started! Поехали!"); RemoveExpiredServers(); while (RunServer) { NetIncomingMessage msg; while ((msg = peer.ReadMessage()) != null) { switch (msg.MessageType) { case NetIncomingMessageType.DebugMessage: LunaLog.NetworkDebug(msg.ReadString()); break; case NetIncomingMessageType.VerboseDebugMessage: LunaLog.NetworkVerboseDebug(msg.ReadString()); break; case NetIncomingMessageType.WarningMessage: LunaLog.Warning(msg.ReadString()); break; case NetIncomingMessageType.ErrorMessage: LunaLog.Error(msg.ReadString()); break; case NetIncomingMessageType.UnconnectedData: var message = GetMessage(msg); if (message != null && !message.VersionMismatch) { HandleMessage(message, msg, peer); } break; } } await Task.Delay(ServerMsTick); } peer.Shutdown("So long and thanks for all the fish!"); }
/// <summary> /// Starts the web server /// </summary> public static void StartWebServer() { if (WebsiteSettings.SettingsStore.EnableWebsite) { try { if (!LunaNetUtils.IsTcpPortInUse(WebsiteSettings.SettingsStore.Port)) { IPAddress listenAddress; if (!string.IsNullOrEmpty(WebsiteSettings.SettingsStore.ListenAddress)) { // Custom ListenAddress for web server, parse it if (!IPAddress.TryParse(WebsiteSettings.SettingsStore.ListenAddress, out listenAddress)) { // Parsing failed, fall back to IPAddress.Any LunaLog.Warning( "Could not parse ListenAddress for web server, falling back to 0.0.0.0"); } } else { // ListenAddress unset for web server, try the one of the game server IPAddress.TryParse(ConnectionSettings.SettingsStore.ListenAddress, out listenAddress); } listenAddress ??= IPAddress.Any; var listener = new TcpListener(listenAddress, WebsiteSettings.SettingsStore.Port); // Listen on dual-stack for the unspecified address in IPv6 format ([::]). if (listenAddress.Equals(IPAddress.IPv6Any)) { listener.Server.DualMode = true; } Server.Use(new TcpListenerAdapter(listener)); Server.Use(new ExceptionHandler()); Server.Use(new CompressionHandler(DeflateCompressor.Default, GZipCompressor.Default)); Server.Use(new FileHandler()); Server.Use(new HttpRouter().With(string.Empty, new RestHandler <ServerInformation>(new ServerInformationRestController(), JsonResponseProvider.Default))); Server.Start(); } else { LunaLog.Error("Could not start web server. Port is already in use."); LunaLog.Info("You can change the web server settings inside 'Config/WebsiteSettings.xml'"); } } catch (Exception e) { LunaLog.Error($"Could not start web server. Details: {e}"); } } }
public static void ValidateDifficultySettings() { if (GeneralSettings.SettingsStore.GameDifficulty == GameDifficulty.Custom) { return; } if (GeneralSettings.SettingsStore.GameDifficulty != GameDifficulty.Custom && HasDifferencesAgainstGivenSetting(GeneralSettings.SettingsStore.GameDifficulty)) { LunaLog.Info("Your GameplaySettings file is different than your GeneralSettings - Difficulty value. " + "So the difficulty setting will be set as \"Custom\". " + $"In case you want to use the default setting values for {GeneralSettings.SettingsStore.GameDifficulty}. " + $"Remove the GameplaySettings.xml file so it's recreated again"); GeneralSettings.SettingsStore.GameDifficulty = GameDifficulty.Custom; } }
public static void Main() { try { Console.Title = $"LMP {LmpVersioning.CurrentVersion}"; Console.OutputEncoding = Encoding.Unicode; ServerContext.StartTime = LunaNetworkTime.UtcNow.Ticks; LunaLog.Info("Remember! Quit the server by using 'Control + C' so a backup is properly made before closing!"); if (Common.PlatformIsWindows()) { ExitSignal.Exit += (sender, args) => Exit(); } else { //Register the ctrl+c event and exit signal if we are on linux Console.CancelKeyPress += (sender, args) => Exit(); } //We disable quick edit as otherwise when you select some text for copy/paste then you can't write to the console and server freezes //This just happens on windows.... if (Common.PlatformIsWindows()) { ConsoleUtil.DisableConsoleQuickEdit(); } //We cannot run more than 6 instances ofd servers + clients as otherwise the sync time will fail (30 seconds / 5 seconds = 6) but we use 3 for safety if (GetRunningInstances() > 3) { throw new HandledException("Cannot run more than 3 servers at a time!"); } //Start the server clock ServerContext.ServerClock.Start(); ServerContext.ServerStarting = true; //Set day for log change ServerContext.Day = LunaNetworkTime.Now.Day; LunaLog.Normal($"Luna Server version: {LmpVersioning.CurrentVersion} ({Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)})"); Universe.CheckUniverse(); LoadSettingsAndGroups(); VesselStoreSystem.LoadExistingVessels(); var scenariosCreated = ScenarioSystem.GenerateDefaultScenarios(); ScenarioStoreSystem.LoadExistingScenarios(scenariosCreated); LmpPluginHandler.LoadPlugins(); WarpSystem.Reset(); LunaLog.Normal($"Starting '{GeneralSettings.SettingsStore.ServerName}' on Port {ConnectionSettings.SettingsStore.Port}... "); LidgrenServer.SetupLidgrenServer(); LmpPortMapper.OpenLmpPort().Wait(); LmpPortMapper.OpenWebPort().Wait(); ServerContext.ServerRunning = true; WebServer.StartWebServer(); //Do not add the command handler thread to the TaskContainer as it's a blocking task LongRunTaskFactory.StartNew(CommandHandler.ThreadMain, CancellationTokenSrc.Token); TaskContainer.Add(LongRunTaskFactory.StartNew(WebServer.RefreshWebServerInformation, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(LmpPortMapper.RefreshUpnpPort, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(LogThread.RunLogThread, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(ClientMainThread.ThreadMain, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(() => BackupSystem.PerformBackups(CancellationTokenSrc.Token), CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(LidgrenServer.StartReceivingMessages, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(LidgrenMasterServer.RegisterWithMasterServer, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(VersionChecker.RefreshLatestVersion, CancellationTokenSrc.Token)); TaskContainer.Add(LongRunTaskFactory.StartNew(VersionChecker.DisplayNewVersionMsg, CancellationTokenSrc.Token)); while (ServerContext.ServerStarting) { Thread.Sleep(500); } LunaLog.Normal("All systems up and running. Поехали!"); LmpPluginHandler.FireOnServerStart(); QuitEvent.WaitOne(); LmpPluginHandler.FireOnServerStop(); LunaLog.Normal("So long and thanks for all the fish!"); } catch (Exception e) { LunaLog.Fatal(e is HandledException ? e.Message : $"Error in main server thread, Exception: {e}"); Console.ReadLine(); //Avoid closing automatically } }