From: AeonLucid Date: Sat, 17 Oct 2020 02:49:36 +0000 (+0200) Subject: Update Hazel to async X-Git-Tag: v1.2.2~103 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=7946399e7b42d0717afd7470616aef2ab6db2283;p=rhonda%2Fimpostor.git Update Hazel to async --- diff --git a/src/Impostor.Server.Api/Net/IConnection.cs b/src/Impostor.Server.Api/Net/IConnection.cs index 911748f..371c5ac 100644 --- a/src/Impostor.Server.Api/Net/IConnection.cs +++ b/src/Impostor.Server.Api/Net/IConnection.cs @@ -36,11 +36,5 @@ namespace Impostor.Server.Net /// Type of the message. /// Message writer for the current connection. IConnectionMessageWriter CreateMessage(MessageType messageType); - - /// - /// Start listening to the client. - /// - /// A representing the asynchronous operation. - ValueTask ListenAsync(); } } \ No newline at end of file diff --git a/src/Impostor.Server.Hazel/HazelConnection.cs b/src/Impostor.Server.Hazel/HazelConnection.cs index a8edb03..4c25f70 100644 --- a/src/Impostor.Server.Hazel/HazelConnection.cs +++ b/src/Impostor.Server.Hazel/HazelConnection.cs @@ -13,15 +13,13 @@ namespace Impostor.Server.Hazel internal class HazelConnection : IConnection { private readonly ILogger _logger; - private readonly ConcurrentStack _pendingMessages; public HazelConnection(Connection innerConnection, ILogger logger) { _logger = logger; - _pendingMessages = new ConcurrentStack(); InnerConnection = innerConnection; - innerConnection.DataReceived += ConnectionOnDataReceived; - innerConnection.Disconnected += ConnectionOnDisconnected; + innerConnection.DataReceived = ConnectionOnDataReceived; + innerConnection.Disconnected = ConnectionOnDisconnected; } public Connection InnerConnection { get; } @@ -32,27 +30,16 @@ namespace Impostor.Server.Hazel public IClient Client { get; set; } - private void ConnectionOnDisconnected(object sender, DisconnectedEventArgs e) + private async ValueTask ConnectionOnDisconnected(DisconnectedEventArgs e) { if (Client != null) { - Task.Run(Client.HandleDisconnectAsync); + await Client.HandleDisconnectAsync(); } } - private void ConnectionOnDataReceived(DataReceivedEventArgs e) + private async ValueTask ConnectionOnDataReceived(DataReceivedEventArgs e) { - Task.Run(() => HandleData(e)); - } - - private async Task HandleData(DataReceivedEventArgs e) - { - if (Client == null) - { - _pendingMessages.Push(e); - return; - } - try { while (true) @@ -79,23 +66,11 @@ namespace Impostor.Server.Hazel { _logger.LogError(ex, "Exception caught in client data handler."); } - finally - { - e.Message.Recycle(); - } } public IConnectionMessageWriter CreateMessage(MessageType messageType) { return new HazelConnectionMessageWriter(messageType, this); } - - public async ValueTask ListenAsync() - { - while (_pendingMessages.TryPop(out var eventArgs)) - { - await HandleData(eventArgs); - } - } } } \ No newline at end of file diff --git a/src/Impostor.Server.Hazel/HazelMatchmaker.cs b/src/Impostor.Server.Hazel/HazelMatchmaker.cs index b4f8fad..e34f37e 100644 --- a/src/Impostor.Server.Hazel/HazelMatchmaker.cs +++ b/src/Impostor.Server.Hazel/HazelMatchmaker.cs @@ -6,7 +6,6 @@ using Hazel; using Hazel.Udp; using Impostor.Server.Games; using Impostor.Server.Hazel.Messages; -using Impostor.Server.Net; using Impostor.Server.Net.Manager; using Impostor.Server.Net.Messages; using Microsoft.Extensions.Logging; @@ -30,7 +29,7 @@ namespace Impostor.Server.Hazel _connectionLogger = connectionLogger; } - public ValueTask StartAsync(IPEndPoint ipEndPoint) + public async ValueTask StartAsync(IPEndPoint ipEndPoint) { var mode = ipEndPoint.AddressFamily switch { @@ -39,31 +38,18 @@ namespace Impostor.Server.Hazel _ => throw new InvalidOperationException() }; - _connection = new UdpConnectionListener(ipEndPoint, mode, s => - { - _logger.LogWarning("Log from Hazel: {0}", s); - }); - - _connection.NewConnection += OnNewConnection; - - _connection.Start(); - - return default; - } - - public ValueTask StopAsync() - { - _connection.Dispose(); + _connection = new UdpConnectionListener(ipEndPoint, mode); + _connection.NewConnection = OnNewConnection; - return default; + await _connection.StartAsync(); } - private void OnNewConnection(NewConnectionEventArgs e) + public async ValueTask StopAsync() { - Task.Run(() => HandleNewConnection(e)); + await _connection.DisposeAsync(); } - private async Task HandleNewConnection(NewConnectionEventArgs e) + private async ValueTask OnNewConnection(NewConnectionEventArgs e) { try { @@ -71,8 +57,6 @@ namespace Impostor.Server.Hazel var clientVersion = e.HandshakeData.ReadInt32(); var name = e.HandshakeData.ReadString(); - e.HandshakeData.Recycle(); - var connection = new HazelConnection(e.Connection, _connectionLogger); // Register client diff --git a/src/Impostor.Server.Hazel/Messages/HazelMessage.cs b/src/Impostor.Server.Hazel/Messages/HazelMessage.cs index 9339cb0..4f08eb4 100644 --- a/src/Impostor.Server.Hazel/Messages/HazelMessage.cs +++ b/src/Impostor.Server.Hazel/Messages/HazelMessage.cs @@ -24,7 +24,7 @@ namespace Impostor.Server.Hazel.Messages throw new ObjectDisposedException(nameof(_reader)); } - return new BufferMessageReader(_reader.Tag, _reader.Buffer.AsMemory(_reader.Offset, _reader.Length)); + return new BufferMessageReader(_reader.Tag, _reader.Buffer); } private void Dispose(bool disposing) diff --git a/src/Impostor.Server/Net/Manager/ClientManager.cs b/src/Impostor.Server/Net/Manager/ClientManager.cs index 7e75c77..04189af 100644 --- a/src/Impostor.Server/Net/Manager/ClientManager.cs +++ b/src/Impostor.Server/Net/Manager/ClientManager.cs @@ -59,8 +59,6 @@ namespace Impostor.Server.Net.Manager var client = _clientFactory.Create(connection, name, clientVersion); Register(client); - - await connection.ListenAsync(); } public void Register(IClient client) diff --git a/src/Impostor.Tools.Proxy/Program.cs b/src/Impostor.Tools.Proxy/Program.cs index 539463c..7af07f3 100644 --- a/src/Impostor.Tools.Proxy/Program.cs +++ b/src/Impostor.Tools.Proxy/Program.cs @@ -68,25 +68,22 @@ namespace Impostor.Tools.Proxy // True if this is our own packet. using (var stream = udp.Payload.ToMemoryStream()) { - var reader = MessageReader.Get(stream.ToArray()); - if (reader.Buffer[0] == (byte) SendOption.Reliable) + var reader = new MessageReader(stream.ToArray()); + var option = reader.Buffer.Span[0]; + if (option == (byte) SendOption.Reliable) { - reader.Offset = 3; - reader.Length = udp.Payload.Length - 3; - reader.Position = 0; + reader = reader.Slice(3); } - else if (reader.Buffer[0] == (byte) UdpSendOption.Acknowledgement || - reader.Buffer[0] == (byte) UdpSendOption.Ping || - reader.Buffer[0] == (byte) UdpSendOption.Hello || - reader.Buffer[0] == (byte) UdpSendOption.Disconnect) + else if (option == (byte) UdpSendOption.Acknowledgement || + option == (byte) UdpSendOption.Ping || + option == (byte) UdpSendOption.Hello || + option == (byte) UdpSendOption.Disconnect) { return; } else { - reader.Offset = 1; - reader.Length = udp.Payload.Length - 1; - reader.Position = 0; + reader = reader.Slice(1); } var isSent = ipSrc.StartsWith("192."); @@ -134,7 +131,7 @@ namespace Impostor.Tools.Proxy break; case 5: case 6: - Console.WriteLine(HexUtils.HexDump(packet.Buffer.Take(packet.Length).ToArray())); + Console.WriteLine(HexUtils.HexDump(packet.Buffer.ToArray().Take(packet.Length).ToArray())); packet.Position = packet.Length; break; case 7: @@ -174,7 +171,7 @@ namespace Impostor.Tools.Proxy case 5: case 6: Console.WriteLine("- GameCode " + packet.ReadInt32()); - Console.WriteLine(HexUtils.HexDump(packet.Buffer.Take(packet.Length).ToArray())); + Console.WriteLine(HexUtils.HexDump(packet.Buffer.ToArray().Take(packet.Length).ToArray())); packet.Position = packet.Length; break; } diff --git a/submodules/Hazel-Networking b/submodules/Hazel-Networking index ebc3b36..1c5c51c 160000 --- a/submodules/Hazel-Networking +++ b/submodules/Hazel-Networking @@ -1 +1 @@ -Subproject commit ebc3b36068f57ebc1d34106e7778560fc8c09559 +Subproject commit 1c5c51c2bd28482128120003e7f72bee22ff8115