/// <summary>
        /// Creates a new sub server
        /// </summary>
        protected SubServerApplication(SubServerType subServerType)
        {
            this.serverId = Utils.NewGuidInt32(GuidCreationCulture.SplitGuid);

            this.ServerConfig = ServerConfig.Initialize(BinaryPath);

            this.ServerType  = subServerType;
            this.subServerId = ServerConfig.SubServer.SubServerId;

            var ip   = IPAddress.Parse(ServerConfig.MasterServer.IP);
            var port = ServerConfig.MasterServer.ServerPort;

            this.MasterIPEndPoint = new IPEndPoint(ip, port);
        }
        protected virtual OperationResponse HandleRegisterGameServerRequest(OperationRequest request)
        {
            var registerRequest = new RegisterSubServer(Protocol, request);

            if (registerRequest.IsValid == false)
            {
                string msg = registerRequest.GetErrorMessage();
                if (Log.IsDebugEnabled)
                {
                    Log.DebugFormat("Invalid register request: {0}", msg);
                }

                return(new OperationResponse(request.OperationCode)
                {
                    DebugMessage = msg, ReturnCode = (short)ErrorCode.OperationInvalid
                });
            }

            if (Log.IsDebugEnabled)
            {
                Log.DebugFormat(
                    "Received register request: Address={0}, UdpPort={2}, TcpPort={1}, Type={3}",
                    registerRequest.GameServerAddress,
                    registerRequest.TcpPort,
                    registerRequest.UdpPort,
                    registerRequest.ServerType);
            }

            if (registerRequest.UdpPort.HasValue)
            {
                UdpAddress = registerRequest.GameServerAddress + ":" + registerRequest.UdpPort;
            }

            if (registerRequest.TcpPort.HasValue)
            {
                TcpAddress = registerRequest.GameServerAddress + ":" + registerRequest.TcpPort;
            }

            ServerId = registerRequest.ServerId;
            Type     = (SubServerType)registerRequest.ServerType;

            _server.SubServers.OnConnect(this);

            return(new OperationResponse(request.OperationCode));
        }
 /// <summary>
 /// Gets all the <see cref="Karen90MmoFramework.Server.Master.IncomingSubServerPeer"/> of a specific type
 /// </summary>
 /// <param name="subServerType"></param>
 /// <returns></returns>
 public IEnumerable <IncomingSubServerPeer> GetSubServersOfType(SubServerType subServerType)
 {
     lock (syncRoot)
         return(Values.Where(server => server.ServerType == subServerType).ToArray());
 }
 /// <summary>
 /// Tries to get a(n) <see cref="Karen90MmoFramework.Server.Master.IncomingSubServerPeer"/> by its server type.
 /// </summary>
 /// <returns>Returns true if found and false otherwise</returns>
 public bool TryGetSubserverByType(SubServerType serverType, int subServerId, out IncomingSubServerPeer peer)
 {
     lock (syncRoot)
         return((peer = this.Values.FirstOrDefault(server => server.ServerType == serverType && server.SubServerId == subServerId)) != null);
 }
 /// <summary>
 /// Tries to get any <see cref="Karen90MmoFramework.Server.Master.IncomingSubServerPeer"/> by its server type.
 /// </summary>
 /// <returns>Returns true if found and false otherwise</returns>
 public bool TryGetSubserverByTypeAny(SubServerType serverType, out IncomingSubServerPeer peer)
 {
     lock (syncRoot)
         return((peer = this.Values.FirstOrDefault(server => (server.ServerType & serverType) == serverType)) != null);
 }