From 6ff97d7db037ffc870ed6a332ef183e76994b480 Mon Sep 17 00:00:00 2001 From: Thomas Woischnig Date: Mon, 4 Dec 2023 17:03:27 +0100 Subject: [PATCH] - Get port from nat punch service --- .../Runtime/LobbyClient.dll | Bin 35840 -> 36352 bytes .../Runtime/LobbyServerDto.dll | Bin 24576 -> 25088 bytes LobbyClient/LobbyClient.cs | 32 +++++++++++++----- LobbyClient/LobbyClientEvent.cs | 6 +++- LobbyClient/LobbyJoinFailReason.cs | 19 +++++++++++ LobbyClient/UdpEchoServer.cs | 1 + LobbyServer/Program.cs | 12 +++++++ LobbyServerDto/LobbyNotFound.cs | 14 ++++++++ 8 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 LobbyClient/LobbyJoinFailReason.cs create mode 100644 LobbyServerDto/LobbyNotFound.cs diff --git a/Assets/NetworkLobbyClient/Runtime/LobbyClient.dll b/Assets/NetworkLobbyClient/Runtime/LobbyClient.dll index f867f383143510a688a030ea0c0f00b170099d16..8956247c6ec53ecb163224e8a2876992f8dd9291 100644 GIT binary patch literal 36352 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 bKl-_!{{=(*wy*pG(f^}9{{L=`*#iFu{@;bZ literal 35840 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 diff --git a/Assets/NetworkLobbyClient/Runtime/LobbyServerDto.dll b/Assets/NetworkLobbyClient/Runtime/LobbyServerDto.dll index 1646bfd301f0fabcef2f718364ead9b2b873e7d8..7b5acc42a5bba58d80f704be888439a917cbaca0 100644 GIT binary patch delta 8090 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 M^sC-g-Bp4A0i+zBp#T5? delta 7845 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 lobby to request a nat punch for /// Optional password of lobby /// The port the game client will later use. We create a udp socket on it and send a packet to the lobby server to get the firewall to map that port for a short period of time - /// after that the udp client will be disposed - public void RequestLobbyNatPunch(Guid lobbyId, string? password, int port = 0) + /// after that the udp client will be disposed. + public int RequestLobbyNatPunch(Guid lobbyId, string? password, int port = 0) { + if(port < 0 && port > 65535) + throw new ArgumentOutOfRangeException(nameof(port)); + byte[]? passwordHash = null; if (!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); - Task.Run(() => - { - using (var udpEchoServer = new UdpEchoServer()) - { - udpEchoServer.Start(port); - QueryExternalIpAndPort(udpEchoServer.Send); - } + var udpEchoServer = new UdpEchoServer(); + udpEchoServer.Start(port); + Task.Run(() => + { + QueryExternalIpAndPort(udpEchoServer.Send); + udpEchoServer.Dispose(); var lobbyRequestNatPunch = new LobbyRequestNatPunch() { LobbyId = lobbyId, @@ -200,6 +202,8 @@ namespace Lobbies var len = lobbyRequestNatPunch.Serialize(messageData); _ = Task.Run(async () => { await tcpClient.Send(messageData, 0, len); bufferRental.Return(messageData); }); }); + + return udpEchoServer.Port; } public void UpdateLobby(string name, int gameMode, int maxPlayerCount, int playerCount, string? password, int port) @@ -381,6 +385,16 @@ namespace Lobbies { switch (LobbyMessageIdentifier.ReadLobbyMessageIdentifier(data.Span)) { + case LobbyNotFound.TypeId: + { + events.Enqueue(new LobbyClientEvent { EventType = LobbyClientEventTypes.LobbyJoinFailed, EventData = new LobbyJoinFailReason { Reason = LobbyJoinFailReason.FailReasons.LobbyNotFound, ErrorMessage = string.Empty } }); + } + break; + case LobbyWrongPassword.TypeId: + { + events.Enqueue(new LobbyClientEvent { EventType = LobbyClientEventTypes.LobbyJoinFailed, EventData = new LobbyJoinFailReason { Reason = LobbyJoinFailReason.FailReasons.WrongPassword, ErrorMessage = string.Empty } }); + } + break; case LobbyClientConnectionInfo.TypeId: { var lobbyClientConnectionInfo = LobbyClientConnectionInfo.Deserialize(data.Span); diff --git a/LobbyClient/LobbyClientEvent.cs b/LobbyClient/LobbyClientEvent.cs index 69f78f5..430631e 100644 --- a/LobbyClient/LobbyClientEvent.cs +++ b/LobbyClient/LobbyClientEvent.cs @@ -63,6 +63,10 @@ /// /// A direct connection test without a nat punch was testet. EventData is with information if a direct connection was possible and on what address. /// - DirectConnectionTestComplete + DirectConnectionTestComplete, + /// + /// A join request to a lobby has failed. EventData is with information about the failure. + /// + LobbyJoinFailed, } } diff --git a/LobbyClient/LobbyJoinFailReason.cs b/LobbyClient/LobbyJoinFailReason.cs new file mode 100644 index 0000000..f2b14c2 --- /dev/null +++ b/LobbyClient/LobbyJoinFailReason.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Lobbies +{ + public class LobbyJoinFailReason + { + public enum FailReasons + { + WrongPassword, + LobbyNotFound, + LobbyFull + } + + public FailReasons Reason { get; internal set; } + public string? ErrorMessage { get; internal set; } + } +} diff --git a/LobbyClient/UdpEchoServer.cs b/LobbyClient/UdpEchoServer.cs index b00d937..81020cf 100644 --- a/LobbyClient/UdpEchoServer.cs +++ b/LobbyClient/UdpEchoServer.cs @@ -198,6 +198,7 @@ namespace Lobbies if (!isDisposed) { Stop(); + while (isRunningV4 || isRunningV6) Task.Yield(); diff --git a/LobbyServer/Program.cs b/LobbyServer/Program.cs index 9aa1bb6..67fd490 100644 --- a/LobbyServer/Program.cs +++ b/LobbyServer/Program.cs @@ -243,6 +243,18 @@ tcpServer.DataReceived += (clientId, dataLength, data) => }); } } + else + { + var messageData = bufferRental.Rent(); + var lobbyNotFound = new LobbyNotFound() { LobbyId = lobbyRequestHostInfo.LobbyId }; + var messageDataLength = lobbyNotFound.Serialize(messageData); + _ = Task.Run(async () => { + await tcpServer.Send(clientId, messageData, 0, messageDataLength); + bufferRental.Return(messageData); + }); + + return; + } } } break; diff --git a/LobbyServerDto/LobbyNotFound.cs b/LobbyServerDto/LobbyNotFound.cs new file mode 100644 index 0000000..8682f7d --- /dev/null +++ b/LobbyServerDto/LobbyNotFound.cs @@ -0,0 +1,14 @@ +namespace LobbyServerDto +{ + /// + /// Send if a client requests information about a password protected lobby with an invalid password hash + /// + [LobbyMessage] + public partial class LobbyNotFound + { + /// + /// Id of the lobby + /// + public Guid LobbyId { get; set; } + } +} \ No newline at end of file