fixing reading message crash

This commit is contained in:
2026-06-05 09:24:44 +03:00
parent 5cc76ddbcc
commit 1ecca099d8
2 changed files with 20 additions and 11 deletions
@@ -57,6 +57,7 @@ namespace mROA.Implementation.Backend
private async Task HandleConnection(TcpClient client)
{
client.NoDelay = true;
Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}");
var interaction = new ChannelInteractionModule(_serialization, _identityGenerator);
@@ -145,30 +145,34 @@ namespace mROA.Implementation
private const int BufferSize = ushort.MaxValue + 19;
private readonly Stream _ioStream;
private readonly Memory<byte> _buffer = new byte[BufferSize];
public StreamExtractor(Stream ioStream)
{
_ioStream = ioStream;
}
public Action<NetworkMessage> MessageReceived = _ => { };
public async Task SingleReceive(CancellationToken token = default)
{
var firstRead = await _ioStream.ReadAsync(_buffer, token);
_ = await _ioStream.ReadExactlyAsync(_buffer[..19], token);
var meta = MemoryMarshal.Read<NetworkMessage.NetworkMessageMeta>(_buffer.Span);
var len = meta.BodyLength;
var readLen = firstRead - 19;
if (readLen != len)
{
var lastPart = _buffer[firstRead..(len + 19)];
var range = 19..(len + 19);
// Console.WriteLine($"{range} {_buffer.Length}");
var lastPart = _buffer[range];
await _ioStream.ReadExactlyAsync(lastPart, cancellationToken: token);
}
var message = meta.ToMessage(_buffer.Span);
// Console.WriteLine("RECV " + message);
MessageReceived(message);
}
public async Task LoopedReceive(CancellationToken token = default)
{
while (token.IsCancellationRequested == false && IsConnected)
@@ -176,14 +180,17 @@ namespace mROA.Implementation
await SingleReceive(token);
}
}
private async Task Send(NetworkMessage message, CancellationToken token = default)
{
var meta = message.ToMeta();
MemoryMarshal.Write(_buffer.Span, ref meta);
message.Data.CopyTo(_buffer.Span[19..]);
var sendingSpan = _buffer[..(19 + meta.BodyLength)];
// Console.WriteLine("SEND " + message);
await _ioStream.WriteAsync(sendingSpan, token);
}
public async Task SendFromChannel(ChannelReader<NetworkMessage> channel,
CancellationToken token = default)
{
@@ -193,6 +200,7 @@ namespace mROA.Implementation
await Send(message, token);
}
}
public bool IsConnected => _ioStream is { CanRead: true, CanWrite: true };
}
}