From e9ea621b93fbb58d9edfca8375918791637bbd52 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 30 Dec 2020 20:59:04 +0800 Subject: +init --- Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs (limited to 'Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs') diff --git a/Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs b/Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs new file mode 100644 index 0000000..64ece55 --- /dev/null +++ b/Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs @@ -0,0 +1,66 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; +using Impostor.Hazel; +using Impostor.Hazel.Udp; +using Impostor.Server.Net.Hazel; +using Impostor.Server.Net.Manager; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.ObjectPool; + +namespace Impostor.Server.Net +{ + internal class Matchmaker + { + private readonly ClientManager _clientManager; + private readonly ObjectPool _readerPool; + private readonly ILogger _logger; + private readonly ILogger _connectionLogger; + private UdpConnectionListener _connection; + + public Matchmaker( + ILogger logger, + ClientManager clientManager, + ObjectPool readerPool, + ILogger connectionLogger) + { + _logger = logger; + _clientManager = clientManager; + _readerPool = readerPool; + _connectionLogger = connectionLogger; + } + + public async ValueTask StartAsync(IPEndPoint ipEndPoint) + { + var mode = ipEndPoint.AddressFamily switch + { + AddressFamily.InterNetwork => IPMode.IPv4, + AddressFamily.InterNetworkV6 => IPMode.IPv6, + _ => throw new InvalidOperationException() + }; + + _connection = new UdpConnectionListener(ipEndPoint, _readerPool, mode); + _connection.NewConnection = OnNewConnection; + + await _connection.StartAsync(); + } + + public async ValueTask StopAsync() + { + await _connection.DisposeAsync(); + } + + private async ValueTask OnNewConnection(NewConnectionEventArgs e) + { + // Handshake. + var clientVersion = e.HandshakeData.ReadInt32(); + var name = e.HandshakeData.ReadString(); + + var connection = new HazelConnection(e.Connection, _connectionLogger); + + // Register client + await _clientManager.RegisterConnectionAsync(connection, name, clientVersion); + } + } +} -- cgit v1.1-26-g67d0