Compare commits

...

2 Commits

Author SHA1 Message Date
edmand46 3531432758 fixed: crash on concurrent authorization 2022-11-13 00:20:41 +04:00
edmand46 6bda468607 v1.0.23-rc 2022-10-24 22:19:50 +04:00
6 changed files with 36 additions and 15 deletions
+1
View File
@@ -1,5 +1,6 @@
{ {
"key": "defaultkey", "key": "defaultkey",
"socket": "udp",
"protocol": "1.0.0", "protocol": "1.0.0",
"statisticsInterval": 5, "statisticsInterval": 5,
"sendRate": 50, "sendRate": 50,
+19 -7
View File
@@ -16,21 +16,33 @@ namespace Ragon.Core
private readonly float _deltaTime = 0.0f; private readonly float _deltaTime = 0.0f;
private readonly Configuration _configuration; private readonly Configuration _configuration;
private readonly RagonSerializer _serializer; private readonly RagonSerializer _serializer;
public ISocketServer SocketServer => _socketServer; public ISocketServer SocketServer => _socketServer;
public Dispatcher Dispatcher => _dispatcher; public Dispatcher Dispatcher => _dispatcher;
public Application(PluginFactory factory, Configuration configuration) public Application(PluginFactory factory, Configuration configuration)
{ {
var authorizationProvider = factory.CreateAuthorizationProvider(configuration); var authorizationProvider = factory.CreateAuthorizationProvider(configuration);
_configuration = configuration; _configuration = configuration;
_serializer = new RagonSerializer(); _serializer = new RagonSerializer();
var dispatcher = new Dispatcher(); var dispatcher = new Dispatcher();
_dispatcher = dispatcher; _dispatcher = dispatcher;
_socketServer = new ENetServer(this); if (configuration.Socket == "udp")
{
_socketServer = new ENetServer(this);
}
else if (configuration.Socket == "websocket")
{
_socketServer = new WebSocketServer(this);
}
else
{
_logger.Error($"Unknown socket type {configuration.Socket}");
}
_deltaTime = 1000.0f / configuration.SendRate; _deltaTime = 1000.0f / configuration.SendRate;
_roomManager = new RoomManager(factory, this); _roomManager = new RoomManager(factory, this);
@@ -84,16 +96,16 @@ namespace Ragon.Core
Thread.Sleep((int) _deltaTime); Thread.Sleep((int) _deltaTime);
} }
} }
public void OnConnected(ushort peerId) public void OnConnected(ushort peerId)
{ {
_logger.Trace("Connected " + peerId); _logger.Trace("Connected " + peerId);
} }
public void OnDisconnected(ushort peerId) public void OnDisconnected(ushort peerId)
{ {
_logger.Trace("Disconnected " + peerId); _logger.Trace("Disconnected " + peerId);
var player = _lobby.AuthorizationManager.GetPlayer(peerId); var player = _lobby.AuthorizationManager.GetPlayer(peerId);
if (player != null) if (player != null)
_roomManager.Left(player, Array.Empty<byte>()); _roomManager.Left(player, Array.Empty<byte>());
+10 -4
View File
@@ -5,7 +5,7 @@ using Ragon.Common;
namespace Ragon.Core; namespace Ragon.Core;
public class AuthorizationManager public class AuthorizationManager
{ {
private Logger _logger = LogManager.GetCurrentClassLogger(); private Logger _logger = LogManager.GetCurrentClassLogger();
private IApplicationHandler _provider; private IApplicationHandler _provider;
@@ -29,12 +29,12 @@ public class AuthorizationManager
{ {
if (_playersByPeers.ContainsKey(peerId)) if (_playersByPeers.ContainsKey(peerId))
{ {
_logger.Warn($"Connection already authorized {peerId}"); _logger.Warn($"Connection already authorized {peerId}");
return; return;
} }
var dispatcher = _gameThread.Dispatcher; var dispatcher = _gameThread.Dispatcher;
_provider.OnAuthorizationRequest(key, name, additionalData.ToArray(), _provider.OnAuthorizationRequest(key, name, additionalData.ToArray(),
(playerId, playerName) => { dispatcher.Dispatch(() => Accepted(peerId, playerId, playerName)); }, (playerId, playerName) => { dispatcher.Dispatch(() => Accepted(peerId, playerId, playerName)); },
(errorCode) => { dispatcher.Dispatch(() => Rejected(peerId, errorCode)); }); (errorCode) => { dispatcher.Dispatch(() => Rejected(peerId, errorCode)); });
@@ -42,6 +42,12 @@ public class AuthorizationManager
public void Accepted(ushort peerId, string playerId, string playerName) public void Accepted(ushort peerId, string playerId, string playerName)
{ {
if (_playersByPeers.ContainsKey(peerId))
{
_logger.Warn($"Connection already authorized {peerId}");
return;
}
_serializer.Clear(); _serializer.Clear();
_serializer.WriteOperation(RagonOperation.AUTHORIZED_SUCCESS); _serializer.WriteOperation(RagonOperation.AUTHORIZED_SUCCESS);
_serializer.WriteString(playerId); _serializer.WriteString(playerId);
+3 -2
View File
@@ -10,6 +10,7 @@ namespace Ragon.Core
{ {
public string Key; public string Key;
public string Protocol; public string Protocol;
public string Socket;
public int StatisticsInterval; public int StatisticsInterval;
public ushort SendRate; public ushort SendRate;
public ushort Port; public ushort Port;
@@ -18,9 +19,9 @@ namespace Ragon.Core
public int MaxConnections; public int MaxConnections;
public int MaxPlayersPerRoom; public int MaxPlayersPerRoom;
public int MaxRooms; public int MaxRooms;
private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
private static readonly string _serverVersion = "1.0.22-rc"; private static readonly string _serverVersion = "1.0.24-rc";
private static void CopyrightInfo() private static void CopyrightInfo()
{ {
+2 -1
View File
@@ -197,6 +197,7 @@ public class Entity
public void Destroy(ReadOnlySpan<byte> payload) public void Destroy(ReadOnlySpan<byte> payload)
{ {
var serializer = _room.GetSharedSerializer(); var serializer = _room.GetSharedSerializer();
serializer.Clear(); serializer.Clear();
serializer.WriteOperation(RagonOperation.DESTROY_ENTITY); serializer.WriteOperation(RagonOperation.DESTROY_ENTITY);
serializer.WriteInt(EntityId); serializer.WriteInt(EntityId);
@@ -236,7 +237,7 @@ public class Entity
var targetMode = (RagonTarget) reader.ReadByte(); var targetMode = (RagonTarget) reader.ReadByte();
var payloadData = reader.ReadData(reader.Size); var payloadData = reader.ReadData(reader.Size);
Span<byte> payloadRaw = stackalloc byte[reader.Size]; Span<byte> payloadRaw = stackalloc byte[payloadData.Length];
ReadOnlySpan<byte> payload = payloadRaw; ReadOnlySpan<byte> payload = payloadRaw;
payloadData.CopyTo(payloadRaw); payloadData.CopyTo(payloadRaw);
+1 -1
View File
@@ -246,7 +246,7 @@ namespace Ragon.Core
{ {
var entityId = reader.ReadInt(); var entityId = reader.ReadInt();
if (_entities.TryGetValue(entityId, out var entity)) if (_entities.TryGetValue(entityId, out var entity))
{ {
var player = _players[peerId]; var player = _players[peerId];
var payload = reader.ReadData(reader.Size); var payload = reader.ReadData(reader.Size);
DetachEntity(player, entity, payload); DetachEntity(player, entity, payload);