示例#1
0
        public bool Start()
        {
            // If no config file has been found, these values are 0 by default
            if (Config.GameConfig.Port == 0 || Config.GameConfig.Backlog == 0)
            {
                Logger.WriteLog(LogType.Error, "Invalid config values!");
                return(false);
            }

            Loop.Start();

            SetupCommunicator();

            try
            {
                ListenerSocket           = new LengthedSocket(SizeType.Dword, false);
                ListenerSocket.OnError  += OnError;
                ListenerSocket.OnAccept += OnAccept;
                ListenerSocket.Bind(new IPEndPoint(IPAddress.Any, Config.GameConfig.Port));
                ListenerSocket.Listen(Config.GameConfig.Backlog);
            }
            catch (Exception e)
            {
                Logger.WriteLog(LogType.Error, "Unable to create or start listening on the client socket! Exception:");
                Logger.WriteLog(LogType.Error, e);

                return(false);
            }

            LoginManager.OnLogin += OnLogin;

            QueueManager = new QueueManager(this);

            ListenerSocket.AcceptAsync();

            Logger.WriteLog(LogType.Network, "*** Listening for clients on port {0}", Config.GameConfig.Port);

            Timer.Add("SessionExpire", 10000, true, () =>
            {
                var toRemove = new List <uint>();

                lock (IncomingClients)
                {
                    toRemove.AddRange(IncomingClients.Where(ic => ic.Value.ExpireTime < DateTime.Now).Select(ic => ic.Key));

                    foreach (var rem in toRemove)
                    {
                        IncomingClients.Remove(rem);
                    }
                }
            });

            Timer.Add("QueueManagerUpdate", Config.QueueConfig.UpdateInterval, true, () =>
            {
                QueueManager.Update(Config.ServerInfoConfig.MaxPlayers - CurrentPlayers);
            });

            return(true);
        }
示例#2
0
        public QueueManager(Server server)
        {
            Server = server;

            Socket           = new LengthedSocket(SizeType.Dword, false);
            Socket.OnError  += OnError;
            Socket.OnAccept += OnAccept;
            Socket.Bind(new IPEndPoint(IPAddress.Any, Config.Port));
            Socket.Listen(Config.Backlog);

            Socket.AcceptAsync();
        }
示例#3
0
        public bool Start()
        {
            // If no config file has been found, these values are 0 by default
            if (Config.AuthConfig.Port == 0 || Config.AuthConfig.Backlog == 0)
            {
                Logger.WriteLog(LogType.Error, "Invalid config values!");
                return(false);
            }

            try
            {
                ListenerSocket           = new LengthedSocket(SizeType.Word);
                ListenerSocket.OnError  += OnError;
                ListenerSocket.OnAccept += OnAccept;
                ListenerSocket.Bind(new IPEndPoint(IPAddress.Any, Config.AuthConfig.Port));
                ListenerSocket.Listen(Config.AuthConfig.Backlog);
            }
            catch (Exception e)
            {
                Logger.WriteLog(LogType.Error, "Unable to create or start listening on the client socket! Exception:");
                Logger.WriteLog(LogType.Error, e);

                return(false);
            }

            Loop.Start();

            if (!SetupCommunicator())
            {
                return(false);
            }

            Logger.WriteLog(LogType.Network, "*** Listening for clients on port {0}", Config.AuthConfig.Port);

            ListenerSocket.AcceptAsync();

            // TODO: Set up timed events (query stuff, internal communication, etc...)

            Timer.Add("DisconnectTimedoutClients", 10000, true, () =>
            {
                lock (Clients)
                    foreach (var c in Clients.Where(c => c.TimeoutTime < DateTime.Now))
                    {
                        c.Close();
                    }
            });

            return(true);
        }
示例#4
0
        private bool SetupCommunicator()
        {
            if (Config.CommunicatorConfig.Port == 0 || Config.CommunicatorConfig.Address == null || Config.CommunicatorConfig.Backlog == 0)
            {
                Logger.WriteLog(LogType.Error, "Invalid Communicator config data! Can't connect!");
                return(false);
            }

            try
            {
                AuthCommunicator           = new LengthedSocket(SizeType.Word);
                AuthCommunicator.OnAccept += OnCommunicatorAccept;
                AuthCommunicator.Bind(new IPEndPoint(IPAddress.Parse(Config.CommunicatorConfig.Address), Config.CommunicatorConfig.Port));
                AuthCommunicator.Listen(Config.CommunicatorConfig.Backlog);
            }
            catch (Exception e)
            {
                Logger.WriteLog(LogType.Error, "Unable to create or start listening on the communicator socket! Exception:");
                Logger.WriteLog(LogType.Error, e);

                return(false);
            }

            AuthCommunicator.AcceptAsync();

            Timer.Add("ServerInfoUpdate", 1000, true, () =>
            {
                lock (GameServers)
                    foreach (var server in GameServers)
                    {
                        if ((DateTime.Now - server.Value.LastRequestTime).TotalMilliseconds > 30000)
                        {
                            server.Value.RequestServerInfo();
                        }
                    }
            });

            Logger.WriteLog(LogType.Network, $"*** Listening for Game servers on port {Config.CommunicatorConfig.Port}");

            return(true);
        }