Reconnection bug solved

This commit is contained in:
2025-05-03 14:54:06 +03:00
parent 6812138eb1
commit f62a4943b9
3 changed files with 14 additions and 7 deletions
@@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Threading; using System.Threading;
@@ -15,6 +16,7 @@ namespace mROA.Implementation.Backend
private readonly TcpListener _tcpListener; private readonly TcpListener _tcpListener;
private IConnectionHub? _hub; private IConnectionHub? _hub;
private ISerializationToolkit? _serialization; private ISerializationToolkit? _serialization;
private Dictionary<int, CancellationTokenSource> _extractorsCTS = new();
public NetworkGatewayModule(IPEndPoint endpoint, Type interactionModuleType, public NetworkGatewayModule(IPEndPoint endpoint, Type interactionModuleType,
IInjectableModule[] injectableModules) IInjectableModule[] injectableModules)
@@ -82,14 +84,16 @@ namespace mROA.Implementation.Backend
streamExtractor.SingleReceive(); streamExtractor.SingleReceive();
var connectionRequest = interaction.GetNextMessageReceiving(false) var connectionRequest = interaction.GetNextMessageReceiving(false)
.GetAwaiter().GetResult()!; .GetAwaiter().GetResult()!;
var cts = new CancellationTokenSource();
switch (connectionRequest.MessageType) switch (connectionRequest.MessageType)
{ {
case EMessageType.ClientConnect: case EMessageType.ClientConnect:
Task.Run(async () => await streamExtractor.LoopedReceive()); Task.Run(async () => await streamExtractor.LoopedReceive(cts.Token));
streamExtractor.SendFromChannel(interaction.TrustedPostChanel); _ = streamExtractor.SendFromChannel(interaction.TrustedPostChanel, cts.Token);
interaction.PostMessageAsync(new NetworkMessageHeader(_serialization!, interaction.PostMessageAsync(new NetworkMessageHeader(_serialization!,
new IdAssignment { Id = -interaction.ConnectionId })); new IdAssignment { Id = -interaction.ConnectionId }));
_extractorsCTS[interaction.ConnectionId] = cts;
_hub!.RegisterInteraction(interaction); _hub!.RegisterInteraction(interaction);
Console.WriteLine("Client registered"); Console.WriteLine("Client registered");
break; break;
@@ -98,12 +102,16 @@ namespace mROA.Implementation.Backend
var recoveryRequest = _serialization!.Deserialize<ClientRecovery>(connectionRequest.Data)!; var recoveryRequest = _serialization!.Deserialize<ClientRecovery>(connectionRequest.Data)!;
var recoveryInteraction = _hub.GetInteraction(recoveryRequest.Id); var recoveryInteraction = _hub.GetInteraction(recoveryRequest.Id);
_extractorsCTS[recoveryRequest.Id].Cancel();
recoveryInteraction.IsConnected = () => streamExtractor.IsConnected; recoveryInteraction.IsConnected = () => streamExtractor.IsConnected;
streamExtractor.MessageReceived = message => streamExtractor.MessageReceived = message =>
{ {
recoveryInteraction.ReceiveChanel.Writer.WriteAsync(message); recoveryInteraction.ReceiveChanel.Writer.WriteAsync(message);
}; };
Task.Run(async () => await streamExtractor.LoopedReceive()); _ = streamExtractor.SendFromChannel(recoveryInteraction.TrustedPostChanel, cts.Token);
Task.Run(async () => await streamExtractor.LoopedReceive(cts.Token));
recoveryInteraction.Restart(false); recoveryInteraction.Restart(false);
@@ -54,7 +54,6 @@ namespace mROA.Implementation
public ChannelReader<NetworkMessageHeader> UntrustedPostChanel => _outputUntrustedChannel.Reader; public ChannelReader<NetworkMessageHeader> UntrustedPostChanel => _outputUntrustedChannel.Reader;
public Func<bool> IsConnected { get; set; } public Func<bool> IsConnected { get; set; }
public void Inject<T>(T dependency) public void Inject<T>(T dependency)
{ {
switch (dependency) switch (dependency)
+1 -1
View File
@@ -21,7 +21,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DefineConstants>TRACE;</DefineConstants> <DefineConstants>;</DefineConstants>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>