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(); } }