diff options
author | chai <chaifix@163.com> | 2020-12-30 20:59:04 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-12-30 20:59:04 +0800 |
commit | e9ea621b93fbb58d9edfca8375918791637bbd52 (patch) | |
tree | 19ce3b1c1f2d51eda6878c9d0f2c9edc27f13650 /Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs |
+init
Diffstat (limited to 'Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs')
-rw-r--r-- | Impostor-dev/src/Impostor.Server/Net/Matchmaker.cs | 66 |
1 files changed, 66 insertions, 0 deletions
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<MessageReader> _readerPool; + private readonly ILogger<Matchmaker> _logger; + private readonly ILogger<HazelConnection> _connectionLogger; + private UdpConnectionListener _connection; + + public Matchmaker( + ILogger<Matchmaker> logger, + ClientManager clientManager, + ObjectPool<MessageReader> readerPool, + ILogger<HazelConnection> 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); + } + } +} |