Example #1
0
        private void HandleRakNetMessage(IPEndPoint senderEndpoint, OpenConnectionRequest1 incoming)
        {
            if (!GreylistManager.AcceptConnection(senderEndpoint))
            {
                var noFree = NoFreeIncomingConnections.CreateObject();
                var bytes  = noFree.Encode();
                noFree.PutPool();

                TraceSend(noFree);

                SendData(bytes, senderEndpoint, new object());
                return;
            }

            if (Log.IsDebugEnabled)
            {
                Log.DebugFormat("New connection from: {0} {1}", senderEndpoint.Address, senderEndpoint.Port);
            }

            lock (_playerSessions)
            {
                // Already connecting, then this is just a duplicate
                if (_connectionAttemps.ContainsKey(senderEndpoint))
                {
                    DateTime created;
                    _connectionAttemps.TryGetValue(senderEndpoint, out created);

                    if (DateTime.UtcNow < created + TimeSpan.FromSeconds(3))
                    {
                        return;
                    }

                    _connectionAttemps.TryRemove(senderEndpoint, out created);
                }

                if (!_connectionAttemps.TryAdd(senderEndpoint, DateTime.UtcNow))
                {
                    return;
                }
            }

            var packet = OpenConnectionReply1.CreateObject();

            packet.serverGuid        = 12345;
            packet.mtuSize           = incoming.mtuSize;
            packet.serverHasSecurity = 0;
            var data = packet.Encode();

            packet.PutPool();

            TraceSend(packet);

            SendData(data, senderEndpoint, new object());
        }
Example #2
0
        private void HandleRakNetMessage(byte[] receiveBytes, IPEndPoint senderEndpoint, byte msgId)
        {
            DefaultMessageIdTypes msgIdType = (DefaultMessageIdTypes)msgId;

            // Increase fast, decrease slow on 1s ticks.
            if (ServerInfo.NumberOfPlayers < ServerInfo.PlayerSessions.Count)
            {
                ServerInfo.NumberOfPlayers = ServerInfo.PlayerSessions.Count;
            }

            // Shortcut to reply fast, and no parsing
            if (msgIdType == DefaultMessageIdTypes.ID_OPEN_CONNECTION_REQUEST_1)
            {
                if (!GreylistManager.AcceptConnection(senderEndpoint.Address))
                {
                    var noFree = NoFreeIncomingConnections.CreateObject();
                    var bytes  = noFree.Encode();
                    noFree.PutPool();

                    TraceSend(noFree);

                    SendData(bytes, senderEndpoint);
                    Interlocked.Increment(ref ServerInfo.NumberOfDeniedConnectionRequestsPerSecond);
                    return;
                }
            }

            Package message = null;

            try
            {
                try
                {
                    message = PackageFactory.CreatePackage(msgId, receiveBytes, "raknet");
                }
                catch (Exception)
                {
                    message = null;
                }

                if (message == null)
                {
                    GreylistManager.Blacklist(senderEndpoint.Address);
                    Log.ErrorFormat("Receive bad packet with ID: {0} (0x{0:x2}) {2} from {1}", msgId, senderEndpoint.Address, (DefaultMessageIdTypes)msgId);

                    return;
                }

                TraceReceive(message);

                switch (msgIdType)
                {
                case DefaultMessageIdTypes.ID_UNCONNECTED_PING:
                case DefaultMessageIdTypes.ID_UNCONNECTED_PING_OPEN_CONNECTIONS:
                {
                    HandleRakNetMessage(senderEndpoint, (UnconnectedPing)message);
                    break;
                }

                case DefaultMessageIdTypes.ID_OPEN_CONNECTION_REQUEST_1:
                {
                    HandleRakNetMessage(senderEndpoint, (OpenConnectionRequest1)message);
                    break;
                }

                case DefaultMessageIdTypes.ID_OPEN_CONNECTION_REQUEST_2:
                {
                    HandleRakNetMessage(senderEndpoint, (OpenConnectionRequest2)message);
                    break;
                }

                default:
                    GreylistManager.Blacklist(senderEndpoint.Address);
                    Log.ErrorFormat("Receive unexpected packet with ID: {0} (0x{0:x2}) {2} from {1}", msgId, senderEndpoint.Address, (DefaultMessageIdTypes)msgId);
                    break;
                }
            }
            finally
            {
                if (message != null)
                {
                    message.PutPool();
                }
            }
        }
Example #3
0
        internal void HandleOfflineRakMessage(ReadOnlyMemory <byte> receiveBytes, IPEndPoint senderEndpoint)
        {
            byte messageId   = receiveBytes.Span[0];
            var  messageType = (DefaultMessageIdTypes)messageId;

            // Increase fast, decrease slow on 1s ticks.
            if (_connectionInfo.NumberOfPlayers < _connectionInfo.RakSessions.Count)
            {
                _connectionInfo.NumberOfPlayers = _connectionInfo.RakSessions.Count;
            }

            // Shortcut to reply fast, and no parsing
            if (messageType == DefaultMessageIdTypes.ID_OPEN_CONNECTION_REQUEST_1)
            {
                if (!_greyListManager.AcceptConnection(senderEndpoint.Address))
                {
                    var noFree = NoFreeIncomingConnections.CreateObject();
                    var bytes  = noFree.Encode();

                    TraceSend(noFree);

                    noFree.PutPool();

                    _sender.SendData(bytes, senderEndpoint);
                    Interlocked.Increment(ref _connectionInfo.NumberOfDeniedConnectionRequestsPerSecond);
                    return;
                }
            }

            Packet message = null;

            try
            {
                try
                {
                    message = PacketFactory.Create(messageId, receiveBytes, "raknet");
                }
                catch (Exception)
                {
                    message = null;
                }

                if (message == null)
                {
                    _greyListManager.Blacklist(senderEndpoint.Address);
                    Log.Error($"Receive bad packet with ID: {messageId} (0x{messageId:x2}) {messageType} from {senderEndpoint.Address}");

                    return;
                }

                TraceReceive(Log, message);

                switch (messageType)
                {
                case DefaultMessageIdTypes.ID_NO_FREE_INCOMING_CONNECTIONS:
                    // Stop this client connection
                    _connection.Stop();
                    break;

                case DefaultMessageIdTypes.ID_UNCONNECTED_PING:
                case DefaultMessageIdTypes.ID_UNCONNECTED_PING_OPEN_CONNECTIONS:
                    HandleRakNetMessage(senderEndpoint, (UnconnectedPing)message);
                    break;

                case DefaultMessageIdTypes.ID_UNCONNECTED_PONG:
                    HandleRakNetMessage(senderEndpoint, (UnconnectedPong)message);
                    break;

                case DefaultMessageIdTypes.ID_OPEN_CONNECTION_REQUEST_1:
                    HandleRakNetMessage(senderEndpoint, (OpenConnectionRequest1)message);
                    break;

                case DefaultMessageIdTypes.ID_OPEN_CONNECTION_REPLY_1:
                    HandleRakNetMessage(senderEndpoint, (OpenConnectionReply1)message);
                    break;

                case DefaultMessageIdTypes.ID_OPEN_CONNECTION_REQUEST_2:
                    HandleRakNetMessage(senderEndpoint, (OpenConnectionRequest2)message);
                    break;

                case DefaultMessageIdTypes.ID_OPEN_CONNECTION_REPLY_2:
                    HandleRakNetMessage(senderEndpoint, (OpenConnectionReply2)message);
                    break;

                default:
                    _greyListManager.Blacklist(senderEndpoint.Address);
                    if (Log.IsInfoEnabled)
                    {
                        Log.Error($"Receive unexpected packet with ID: {messageId} (0x{messageId:x2}) {messageType} from {senderEndpoint.Address}");
                    }
                    break;
                }
            }
            finally
            {
                message?.PutPool();
            }
        }