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