From db110e197c076b1fc412b29cbb38632a15f868e8 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Mon, 31 Mar 2025 12:27:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=83=D1=8E=20=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC=D1=83=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mROA/Abstract/IInteractionModule.cs | 2 +- .../Backend/NetworkGatewayModule.cs | 46 ++++++++++++++----- .../Frontend/NetworkFrontendBridge.cs | 12 +++-- mROA/Implementation/IdAssignment.cs | 11 +++++ mROA/Implementation/NetworkMessageHeader.cs | 17 ++++++- .../NextGenerationInteractionModule.cs | 46 ++++++++++++++----- mROA/Implementation/RepresentationModule.cs | 6 +-- 7 files changed, 106 insertions(+), 34 deletions(-) diff --git a/mROA/Abstract/IInteractionModule.cs b/mROA/Abstract/IInteractionModule.cs index 0939528..45ee3c7 100644 --- a/mROA/Abstract/IInteractionModule.cs +++ b/mROA/Abstract/IInteractionModule.cs @@ -7,7 +7,7 @@ namespace mROA.Abstract { public interface INextGenerationInteractionModule : IInjectableModule { - int ConnectionId { get; } + int ConnectionId { get; set; } public Stream? BaseStream { get; set; } Task GetNextMessageReceiving(); Task PostMessage(NetworkMessageHeader messageHeader); diff --git a/mROA/Implementation/Backend/NetworkGatewayModule.cs b/mROA/Implementation/Backend/NetworkGatewayModule.cs index 56d7bea..43f82c6 100644 --- a/mROA/Implementation/Backend/NetworkGatewayModule.cs +++ b/mROA/Implementation/Backend/NetworkGatewayModule.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; @@ -68,20 +69,41 @@ namespace mROA.Implementation.Backend Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}"); var interaction = Activator.CreateInstance(_interactionModuleType!) as INextGenerationInteractionModule; - foreach (var injectableModule in _injectableModules!) - interaction!.Inject(injectableModule); + var connectionRequest = interaction.GetNextMessageReceiving().GetAwaiter().GetResult()!; - interaction!.Inject(_serialization); - - interaction.BaseStream = client.GetStream(); - - interaction.PostMessage(new NetworkMessageHeader + if (connectionRequest.MessageType == EMessageType.ClientConnect) { - Id = Guid.NewGuid(), EMessageType = EMessageType.IdAssigning, - Data = _serialization!.Serialize(new IdAssignment { Id = -interaction.ConnectionId }) - }); - _hub!.RegisterInteraction(interaction); - Console.WriteLine("Client registered"); + foreach (var injectableModule in _injectableModules!) + interaction!.Inject(injectableModule); + + interaction!.Inject(_serialization); + + interaction.BaseStream = client.GetStream(); + + interaction.PostMessage(new NetworkMessageHeader(_serialization!, + new IdAssignment { Id = -interaction.ConnectionId })); + _hub!.RegisterInteraction(interaction); + Console.WriteLine("Client registered"); + }else if (connectionRequest.MessageType == EMessageType.ClientRecovery) + { + var modidiedModules = _injectableModules!.ToList(); + modidiedModules.RemoveAll(i => i is IIdentityGenerator); + + foreach (var injectableModule in modidiedModules) + interaction.Inject(injectableModule); + + var recoveryRequest = _serialization!.Deserialize(connectionRequest.Data)!; + interaction.ConnectionId = recoveryRequest.Id; + + interaction.Inject(_serialization); + + interaction.BaseStream = client.GetStream(); + + interaction.PostMessage(new NetworkMessageHeader(_serialization!, + new IdAssignment { Id = -interaction.ConnectionId })); + _hub!.RegisterInteraction(interaction); + Console.WriteLine("Client registered"); + } } } diff --git a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs index 86a7d79..2554c6d 100644 --- a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs +++ b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs @@ -2,6 +2,7 @@ using System; using System.Net; using System.Net.Sockets; using mROA.Abstract; +using Exception = System.Exception; namespace mROA.Implementation.Frontend { @@ -39,14 +40,17 @@ namespace mROA.Implementation.Frontend _tcpClient.Connect(_ipEndPoint); _interactionModule.BaseStream = _tcpClient.GetStream(); + + _interactionModule.PostMessage(new NetworkMessageHeader(_serialization, new ClientConnect())).Wait(); var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult(); - if (welcomeMessage.EMessageType != EMessageType.IdAssigning) + if (welcomeMessage.MessageType != EMessageType.IdAssigning) { throw new Exception( - $"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.EMessageType.ToString()}"); + $"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.MessageType.ToString()}"); } - - + + + var assignment = _serialization.Deserialize(welcomeMessage.Data)!; _interactionModule.ConnectionId = -assignment.Id; TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(assignment.Id); diff --git a/mROA/Implementation/IdAssignment.cs b/mROA/Implementation/IdAssignment.cs index a48a56a..924eb94 100644 --- a/mROA/Implementation/IdAssignment.cs +++ b/mROA/Implementation/IdAssignment.cs @@ -6,4 +6,15 @@ namespace mROA.Implementation public EMessageType MessageType => EMessageType.IdAssigning; } + + public class ClientRecovery : INetworkMessage + { + public int Id { get; set; } + public EMessageType MessageType => EMessageType.ClientRecovery; + } + + public class ClientConnect : INetworkMessage + { + public EMessageType MessageType => EMessageType.ClientConnect; + } } \ No newline at end of file diff --git a/mROA/Implementation/NetworkMessageHeader.cs b/mROA/Implementation/NetworkMessageHeader.cs index edbe3d5..fcc04ac 100644 --- a/mROA/Implementation/NetworkMessageHeader.cs +++ b/mROA/Implementation/NetworkMessageHeader.cs @@ -1,5 +1,6 @@ using System; using System.Text.Json.Serialization; +using mROA.Abstract; using mROA.Implementation.Attributes; // ReSharper disable UnusedMember.Global @@ -13,10 +14,21 @@ namespace mROA.Implementation } public class NetworkMessageHeader { + public NetworkMessageHeader() + { + Id = Guid.NewGuid(); + MessageType = EMessageType.Unknown; + Data = Array.Empty(); + } + public NetworkMessageHeader(ISerializationToolkit serializationToolkit, INetworkMessage networkMessage) + { + MessageType = networkMessage.MessageType; + Data = serializationToolkit.Serialize(networkMessage); + } public Guid Id { get; set; } [JsonConverter(typeof(JsonStringEnumConverter))] - public EMessageType EMessageType { get; set; } + public EMessageType MessageType { get; set; } public byte[] Data { get; set; } } @@ -30,6 +42,7 @@ namespace mROA.Implementation IdAssigning, CancelRequest, EventRequest, - ClientRecovery + ClientRecovery, + ClientConnect } } \ No newline at end of file diff --git a/mROA/Implementation/NextGenerationInteractionModule.cs b/mROA/Implementation/NextGenerationInteractionModule.cs index f817e9b..3bb89df 100644 --- a/mROA/Implementation/NextGenerationInteractionModule.cs +++ b/mROA/Implementation/NextGenerationInteractionModule.cs @@ -14,8 +14,21 @@ namespace mROA.Implementation private readonly List _messageBuffer = new(128); private Task? _currentReceiving; private ISerializationToolkit? _serialization; + private Stream? _baseStream; public int ConnectionId { get; set; } - public Stream? BaseStream { get; set; } + + public Stream? BaseStream + { + get => _baseStream; + set + { + if (_baseStream is null) + { + + } + _baseStream = value; + } + } public void Inject(T dependency) @@ -77,27 +90,36 @@ namespace mROA.Implementation throw new NullReferenceException("Serialization toolkit is null"); - // Console.WriteLine("Receiving message"); - var firstBit = (byte)BaseStream.ReadByte(); - var secondBit = (byte)BaseStream.ReadByte(); + try + { + // Console.WriteLine("Receiving message"); + var firstBit = (byte)BaseStream.ReadByte(); + var secondBit = (byte)BaseStream.ReadByte(); - var len = BitConverter.ToUInt16(new[] { firstBit, secondBit }); - var localSpan = _buffer[..len]; + var len = BitConverter.ToUInt16(new[] { firstBit, secondBit }); + var localSpan = _buffer[..len]; - await BaseStream.ReadExactlyAsync(localSpan); + await BaseStream.ReadExactlyAsync(localSpan); - // Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len])); + // Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len])); - var message = _serialization.Deserialize(localSpan.Span); + var message = _serialization.Deserialize(localSpan.Span); #if TRACE Console.WriteLine($"{DateTime.Now.TimeOfDay} Received Message {message.Id} - {message.SchemaId}"); TransmissionConfig.TotalTransmittedBytes += len; Console.WriteLine($"Total recieced bytes are {TransmissionConfig.TotalTransmittedBytes}"); #endif - _messageBuffer.Add(message); - _currentReceiving = Task.Run(async () => await GetNextMessage()); + _messageBuffer.Add(message); + _currentReceiving = Task.Run(async () => await GetNextMessage()); + + return message; + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } - return message; } } } \ No newline at end of file diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index fce743a..e5c1d67 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -56,7 +56,7 @@ namespace mROA.Implementation var fromBuffer = _interaction.FirstByFilter(message => (requestId is null || message.Id == requestId) && - (messageType is null || message.EMessageType == messageType)); + (messageType is null || message.MessageType == messageType)); if (fromBuffer == null) { @@ -64,7 +64,7 @@ namespace mROA.Implementation { var message = await _interaction.GetNextMessageReceiving(); if ((requestId is not null && message.Id != requestId) || - (messageType is not null && message.EMessageType != messageType)) + (messageType is not null && message.MessageType != messageType)) continue; _interaction.HandleMessage(message); @@ -98,7 +98,7 @@ namespace mROA.Implementation var serialized = _serialization.Serialize(payload, payloadType); await _interaction.PostMessage(new NetworkMessageHeader - { Id = id, EMessageType = eMessageType, Data = serialized }); + { Id = id, MessageType = eMessageType, Data = serialized }); } public void PostCallMessage(Guid id, EMessageType eMessageType, T payload) where T : notnull