コード例 #1
0
ファイル: Program.cs プロジェクト: genaray/MLAPI_Relay
        private static void Main(string[] args)
        {
            string configPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "config.json");

            if (!File.Exists(configPath))
            {
                Console.WriteLine("================================");
                Console.WriteLine("There is no config. Please select the transport you would like:");
                Console.WriteLine("[R]uffles");
                Console.WriteLine("[U]net");

                ConsoleKey key = ConsoleKey.Escape;

                do
                {
                    key = Console.ReadKey(true).Key;
                }while (key != ConsoleKey.R && key != ConsoleKey.U);

                if (key == ConsoleKey.U)
                {
                    Transport = new UnetTransport();

                    Console.WriteLine("================================");
                    Console.WriteLine("Please select a template for the UNET config file:");
                    Console.WriteLine("[M]LAPI - Copies the same UNET settings as the MLAPI uses by default");
                    Console.WriteLine("[H]LAPI - Copies the same UNET settings as the HLAPI uses by default");
                    Console.WriteLine("[E]mpty - Default UNET settings");

                    key = ConsoleKey.Escape;

                    do
                    {
                        key = Console.ReadKey(true).Key;
                    }while (key != ConsoleKey.M && key != ConsoleKey.H && key != ConsoleKey.E);

                    if (key == ConsoleKey.M)
                    {
                        UnetTransport.UnetConfig config = (UnetTransport.UnetConfig)Transport.GetConfig();

                        config.ConnectionConfig.AddChannel(QosType.ReliableFragmentedSequenced);
                        config.ConnectionConfig.AddChannel(QosType.Reliable);
                        config.ConnectionConfig.AddChannel(QosType.UnreliableSequenced);
                        config.ConnectionConfig.AddChannel(QosType.ReliableSequenced);
                        config.ConnectionConfig.AddChannel(QosType.ReliableSequenced);
                        config.ConnectionConfig.AddChannel(QosType.UnreliableSequenced);
                        config.ConnectionConfig.AddChannel(QosType.Unreliable);

                        Config = new RelayConfig()
                        {
                            Transport                   = TransportType.UNET,
                            AllowTemporaryAlloc         = true,
                            MaxTemporaryAlloc           = 1024 * 16,
                            BandwidthGracePrediodLength = 60 * 2,
                            BandwidthLimit              = -1,
                            EnableRuntimeMetaLogging    = true,
                            GracePeriodBandwidthLimit   = -1,
                            TransportConfig             = config,
                            BufferSize                  = 1024 * 8,
                            ListenPort                  = 8888
                        };
                    }
                    else if (key == ConsoleKey.H)
                    {
                        UnetTransport.UnetConfig config = (UnetTransport.UnetConfig)Transport.GetConfig();

                        config.ConnectionConfig.AddChannel(QosType.ReliableSequenced);
                        config.ConnectionConfig.AddChannel(QosType.Unreliable);

                        Config = new RelayConfig()
                        {
                            Transport                   = TransportType.UNET,
                            BufferSize                  = 1024 * 8,
                            AllowTemporaryAlloc         = true,
                            BandwidthGracePrediodLength = 60 * 2,
                            BandwidthLimit              = -1,
                            EnableRuntimeMetaLogging    = true,
                            GracePeriodBandwidthLimit   = -1,
                            ListenPort                  = 8888,
                            MaxTemporaryAlloc           = 1024 * 16,
                            TransportConfig             = config
                        };
                    }
                    else if (key == ConsoleKey.E)
                    {
                        UnetTransport.UnetConfig config = (UnetTransport.UnetConfig)Transport.GetConfig();

                        Config = new RelayConfig()
                        {
                            Transport                   = TransportType.UNET,
                            BufferSize                  = 1024 * 8,
                            AllowTemporaryAlloc         = true,
                            BandwidthGracePrediodLength = 60 * 2,
                            BandwidthLimit              = -1,
                            EnableRuntimeMetaLogging    = true,
                            GracePeriodBandwidthLimit   = -1,
                            ListenPort                  = 8888,
                            MaxTemporaryAlloc           = 1024 * 16,
                            TransportConfig             = config
                        };
                    }
                }
                else if (key == ConsoleKey.R)
                {
                    Transport = new RufflesTransport();

                    RufflesTransport.RufflesConfig config = (RufflesTransport.RufflesConfig)Transport.GetConfig();

                    Config = new RelayConfig()
                    {
                        Transport                   = TransportType.Ruffles,
                        AllowTemporaryAlloc         = true,
                        BandwidthGracePrediodLength = 60 * 2,
                        BandwidthLimit              = -1,
                        BufferSize                  = 1024 * 8,
                        EnableRuntimeMetaLogging    = true,
                        GracePeriodBandwidthLimit   = -1,
                        ListenPort                  = 8888,
                        MaxTemporaryAlloc           = 1024 * 16,
                        TransportConfig             = config
                    };
                }

                if (Config != null)
                {
                    object config = Transport.BeforeSerializeConfig(Config);

                    string serializedJson = JsonConvert.SerializeObject(config, Formatting.Indented);

                    File.WriteAllText(configPath, Transport.ProcessSerializedJson(serializedJson));
                }
                else
                {
                    // TODO: Something went wrong. No config??
                }
            }
            else
            {
                try
                {
                    Config = JsonConvert.DeserializeObject <RelayConfig>(File.ReadAllText(configPath));

                    switch (Config.Transport)
                    {
                    case TransportType.Ruffles:
                        Transport = new RufflesTransport();
                        break;

                    case TransportType.UNET:
                        Transport = new UnetTransport();
                        break;
                    }

                    // Post deserialization job
                    Config = (RelayConfig)Transport.AfterDeserializedConfig(Config);
                }
                catch (Exception e)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("[ERROR] Error parsing config file: " + e);
                    Console.Read();
                    Environment.Exit(1);
                    return;
                }
            }

            Program.MESSAGE_BUFFER = new byte[Config.BufferSize];

            try
            {
                Console.WriteLine("[INFO] Starting server...");
                Transport.Start(Config.TransportConfig);
                Console.WriteLine("[INFO] Server started!");
            }
            catch (DllNotFoundException e)
            {
                Console.WriteLine("[FATAL] Could not locate one or more shared libraries! Message: \n" + e);
            }
            catch (Exception e)
            {
                Console.WriteLine("[FATAL] An unexpected error occurred! Message: \n" + e);
            }

            Stopwatch watch = new Stopwatch();

            while (true)
            {
                try
                {
                    watch.Restart();

                    RunLoop();

                    int timeBetweenTicks = (int)((1f / Config.TicksPerSecond) * 1000f);
                    int timeToSleep      = timeBetweenTicks - (int)watch.ElapsedMilliseconds;

                    if (timeToSleep > 0)
                    {
                        Thread.Sleep(timeToSleep);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("[ERROR] Exception during loop: " + e);
                }
            }
        }