From 139b3b9a7be2456a682085379af346baeba45db7 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Tue, 6 May 2025 11:50:01 -0500 Subject: [PATCH 01/12] Add support for connecting via a hostname instead of IP when using supported versions of unity and unity transport. --- .../Runtime/Transports/UTP/UnityTransport.cs | 19 +++++++++++++------ .../Runtime/com.unity.netcode.runtime.asmdef | 10 ++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index c910b679f1..b9b7ec50d8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -317,10 +317,7 @@ private static NetworkEndpoint ParseNetworkEndpoint(string ip, ushort port, bool if (!NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv4) && !NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv6)) { - if (!silent) - { - Debug.LogError($"Invalid network endpoint: {ip}:{port}."); - } + return default; } return endpoint; @@ -539,11 +536,21 @@ private bool ClientBindAndConnect() serverEndpoint = ConnectionData.ServerEndPoint; } + NetworkConnection serverConnection; + // Verify the endpoint is valid before proceeding if (serverEndpoint.Family == NetworkFamily.Invalid) { +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE + // If it's not valid, try to treat it like a URL. + InitDriver(); + serverConnection = m_Driver.Connect(ConnectionData.Address, ConnectionData.Port); + m_ServerClientId = ParseClientId(serverConnection); + return true; +#else Debug.LogError($"Target server network address ({ConnectionData.Address}) is {nameof(NetworkFamily.Invalid)}!"); return false; +#endif } InitDriver(); @@ -556,7 +563,7 @@ private bool ClientBindAndConnect() return false; } - var serverConnection = m_Driver.Connect(serverEndpoint); + serverConnection = m_Driver.Connect(serverEndpoint); m_ServerClientId = ParseClientId(serverConnection); return true; @@ -647,7 +654,7 @@ public void SetClientRelayData(string ipAddress, ushort port, byte[] allocationI /// /// Sets IP and Port information. This will be ignored if using the Unity Relay and you should call /// - /// The remote IP address (despite the name, can be an IPv6 address) + /// The remote IP address (despite the name, can be an IPv6 address or a domain name) /// The remote port /// The local listen address public void SetConnectionData(string ipv4Address, ushort port, string listenAddress = null) diff --git a/com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef b/com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef index 3b673da866..2f2005a1cb 100644 --- a/com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef +++ b/com.unity.netcode.gameobjects/Runtime/com.unity.netcode.runtime.asmdef @@ -42,10 +42,20 @@ "expression": "2.1.0", "define": "UTP_TRANSPORT_2_1_ABOVE" }, + { + "name": "com.unity.transport", + "expression": "2.4.0", + "define": "UTP_TRANSPORT_2_4_ABOVE" + }, { "name": "Unity", "expression": "2023", "define": "UNITY_DEDICATED_SERVER_ARGUMENTS_PRESENT" + }, + { + "name": "Unity", + "expression": "6000.1.0a1", + "define": "HOSTNAME_RESOLUTION_AVAILABLE" } ] } From cf1811db33385bcae3220ea2a0a156ee7e590db5 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Tue, 6 May 2025 11:55:36 -0500 Subject: [PATCH 02/12] Changelog --- com.unity.netcode.gameobjects/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index 4e011d8b95..33da2cb693 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -10,6 +10,8 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Added +- When using UnityTransport >=2.4 and Unity >= 6000.1.0a1, SetConnectionData will accept a fully qualified hostname instead of an IP as a connect address on the client side. (#3440) + ### Fixed - Fixed issue where when a client changes ownership via RPC the `NetworkBehaviour.OnOwnershipChanged` can result in identical previous and current owner identifiers. (#3434) From 6bca185da3129c72c29022169af6f6f917f3faf2 Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Tue, 6 May 2025 16:32:30 -0500 Subject: [PATCH 03/12] Fix failing tests --- .../Editor/Transports/UnityTransportTests.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs index fb61c053a1..0a1a6368ea 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/Transports/UnityTransportTests.cs @@ -119,7 +119,6 @@ public void UnityTransport_RestartSucceedsAfterFailure() Assert.False(transport.StartServer()); - LogAssert.Expect(LogType.Error, "Invalid network endpoint: 127.0.0.:4242."); LogAssert.Expect(LogType.Error, "Network listen address (127.0.0.) is Invalid!"); transport.SetConnectionData("127.0.0.1", 4242, "127.0.0.1"); @@ -141,22 +140,6 @@ public void UnityTransport_StartServerWithoutAddresses() transport.Shutdown(); } - // Check that StartClient returns false with bad connection data. - [Test] - public void UnityTransport_StartClientFailsWithBadAddress() - { - UnityTransport transport = new GameObject().AddComponent(); - transport.Initialize(); - - transport.SetConnectionData("foobar", 4242); - Assert.False(transport.StartClient()); - - LogAssert.Expect(LogType.Error, "Invalid network endpoint: foobar:4242."); - LogAssert.Expect(LogType.Error, "Target server network address (foobar) is Invalid!"); - - transport.Shutdown(); - } - #if UTP_TRANSPORT_2_0_ABOVE [Test] public void UnityTransport_EmptySecurityStringsShouldThrow([Values("", null)] string cert, [Values("", null)] string secret) From 9cf9ec73421a5298a21df99d0ab050790cabd0ca Mon Sep 17 00:00:00 2001 From: Kitty Draper Date: Tue, 6 May 2025 16:55:10 -0500 Subject: [PATCH 04/12] Removed test that is no longer valid. --- .../Transports/UnityTransportConnectionTests.cs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs index 8effb7096c..671515d27c 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs @@ -45,22 +45,6 @@ public IEnumerator Cleanup() yield return null; } - // Check that invalid endpoint addresses are detected and return false if detected - [Test] - public void DetectInvalidEndpoint() - { - using var netcodeLogAssert = new NetcodeLogAssert(true); - InitializeTransport(out m_Server, out m_ServerEvents); - InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); - m_Server.ConnectionData.Address = "Fubar"; - m_Server.ConnectionData.ServerListenAddress = "Fubar"; - m_Clients[0].ConnectionData.Address = "MoreFubar"; - Assert.False(m_Server.StartServer(), "Server failed to detect invalid endpoint!"); - Assert.False(m_Clients[0].StartClient(), "Client failed to detect invalid endpoint!"); - netcodeLogAssert.LogWasReceived(LogType.Error, $"Network listen address ({m_Server.ConnectionData.Address}) is Invalid!"); - netcodeLogAssert.LogWasReceived(LogType.Error, $"Target server network address ({m_Clients[0].ConnectionData.Address}) is Invalid!"); - } - // Check connection with a single client. [UnityTest] public IEnumerator ConnectSingleClient() From b7c08c5e955ab89a449c79310f4e9538587cd376 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 8 May 2025 14:55:50 -0500 Subject: [PATCH 05/12] update Bringing the updates from #3441 to the v1.x.x branch. --- .../Runtime/Transports/UTP/UnityTransport.cs | 54 +++++++++++-- .../Editor/Transports/UnityTransportTests.cs | 25 ++++++- .../com.unity.netcode.editortests.asmdef | 10 +++ .../UnityTransportConnectionTests.cs | 49 +++++++++--- .../Transports/UnityTransportTestHelpers.cs | 75 ++++++++++++++++--- .../com.unity.netcode.runtimetests.asmdef | 10 +++ 6 files changed, 198 insertions(+), 25 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index b9b7ec50d8..034febf2e1 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -7,6 +7,9 @@ using System; using System.Collections.Generic; +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE +using System.Text.RegularExpressions; +#endif using UnityEngine; using NetcodeNetworkEvent = Unity.Netcode.NetworkEvent; using TransportNetworkEvent = Unity.Networking.Transport.NetworkEvent; @@ -317,7 +320,14 @@ private static NetworkEndpoint ParseNetworkEndpoint(string ip, ushort port, bool if (!NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv4) && !NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv6)) { +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE return default; +#else // If the user does not have the most recent version of UnityTransport installed + if (!silent) + { + Debug.LogError($"Invalid network endpoint: {ip}:{port}."); + } +#endif } return endpoint; @@ -514,6 +524,16 @@ private NetworkPipeline SelectSendPipeline(NetworkDelivery delivery) } } +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE + private bool IsValidFqdn(string fqdn) + { + // Regular expression to validate FQDN + string pattern = @"^(?=.{1,255}$)(?!-)[A-Za-z0-9-]{1,63}(?(); + transport.Initialize(); + + transport.SetConnectionData("foobar", 4242); + Assert.False(transport.StartClient()); +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE + LogAssert.Expect(LogType.Error, "Target server network address (foobar) is not a valid Fully Qualified Domain Name!"); +#else + LogAssert.Expect(LogType.Error, "Invalid network endpoint: foobar:4242."); + LogAssert.Expect(LogType.Error, "Target server network address (foobar) is Invalid!"); +#endif + + transport.Shutdown(); + } + #if UTP_TRANSPORT_2_0_ABOVE [Test] public void UnityTransport_EmptySecurityStringsShouldThrow([Values("", null)] string cert, [Values("", null)] string secret) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef b/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef index 56d2377536..26172db1d6 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Editor/com.unity.netcode.editortests.asmdef @@ -38,6 +38,16 @@ "name": "com.unity.transport", "expression": "2.0.0-exp", "define": "UTP_TRANSPORT_2_0_ABOVE" + }, + { + "name": "com.unity.transport", + "expression": "2.4.0", + "define": "UTP_TRANSPORT_2_4_ABOVE" + }, + { + "name": "Unity", + "expression": "6000.1.0a1", + "define": "HOSTNAME_RESOLUTION_AVAILABLE" } ] } diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs index 671515d27c..4db30bf85b 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs @@ -22,6 +22,7 @@ public class UnityTransportConnectionTests [UnityTearDown] public IEnumerator Cleanup() { + VerboseDebug = false; if (m_Server) { m_Server.Shutdown(); @@ -45,6 +46,33 @@ public IEnumerator Cleanup() yield return null; } + // Check that invalid endpoint addresses are detected and return false if detected + [Test] + public void DetectInvalidEndpoint() + { + using var netcodeLogAssert = new NetcodeLogAssert(true); + InitializeTransport(out m_Server, out m_ServerEvents); + InitializeTransport(out m_Clients[0], out m_ClientsEvents[0]); + m_Server.ConnectionData.Address = "Fubar"; + m_Server.ConnectionData.ServerListenAddress = "Fubar"; + m_Clients[0].ConnectionData.Address = "MoreFubar"; + Assert.False(m_Server.StartServer(), "Server failed to detect invalid endpoint!"); + Assert.False(m_Clients[0].StartClient(), "Client failed to detect invalid endpoint!"); +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE + LogAssert.Expect(LogType.Error, $"Listen network address ({m_Server.ConnectionData.Address}) is not a valid {Networking.Transport.NetworkFamily.Ipv4} or {Networking.Transport.NetworkFamily.Ipv6} address!"); + LogAssert.Expect(LogType.Error, $"Target server network address ({m_Clients[0].ConnectionData.Address}) is not a valid Fully Qualified Domain Name!"); + + m_Server.ConnectionData.Address = "my.fubar.com"; + m_Server.ConnectionData.ServerListenAddress = "my.fubar.com"; + Assert.False(m_Server.StartServer(), "Server failed to detect invalid endpoint!"); + LogAssert.Expect(LogType.Error, $"While ({m_Server.ConnectionData.Address}) is a valid Fully Qualified Domain Name, you must use a " + + $"valid {Networking.Transport.NetworkFamily.Ipv4} or {Networking.Transport.NetworkFamily.Ipv6} address when binding and listening for connections!"); +#else + netcodeLogAssert.LogWasReceived(LogType.Error, $"Network listen address ({m_Server.ConnectionData.Address}) is Invalid!"); + netcodeLogAssert.LogWasReceived(LogType.Error, $"Target server network address ({m_Clients[0].ConnectionData.Address}) is Invalid!"); +#endif + } + // Check connection with a single client. [UnityTest] public IEnumerator ConnectSingleClient() @@ -170,35 +198,36 @@ public IEnumerator ClientDisconnectSingleClient() [UnityTest] public IEnumerator ClientDisconnectMultipleClients() { - InitializeTransport(out m_Server, out m_ServerEvents); - m_Server.StartServer(); + VerboseDebug = true; + InitializeTransport(out m_Server, out m_ServerEvents, identifier: "Server"); + Assert.True(m_Server.StartServer(), "Failed to start server!"); for (int i = 0; i < k_NumClients; i++) { - InitializeTransport(out m_Clients[i], out m_ClientsEvents[i]); - m_Clients[i].StartClient(); + InitializeTransport(out m_Clients[i], out m_ClientsEvents[i], identifier: $"Client-{i + 1}"); + Assert.True(m_Clients[i].StartClient(), $"Failed to start client-{i + 1}"); + // Assure all clients have connected before disconnecting them + yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ClientsEvents[i], 5); } - yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ClientsEvents[k_NumClients - 1]); - // Disconnect a single client. + VerboseLog($"Disconnecting Client-1"); m_Clients[0].DisconnectLocalClient(); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents, 1); // Disconnect all the other clients. for (int i = 1; i < k_NumClients; i++) { + VerboseLog($"Disconnecting Client-{i + 1}"); m_Clients[i].DisconnectLocalClient(); } - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents); + yield return WaitForMultipleNetworkEvents(NetworkEvent.Disconnect, m_ServerEvents, 4, 20); // Check that we got the correct number of Disconnect events on the server. Assert.AreEqual(k_NumClients * 2, m_ServerEvents.Count); Assert.AreEqual(k_NumClients, m_ServerEvents.Count(e => e.Type == NetworkEvent.Disconnect)); - - yield return null; } // Check that server re-disconnects are no-ops. diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs index aeb25434fc..2a37e51e44 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs @@ -19,21 +19,63 @@ public static class UnityTransportTestHelpers // Wait for an event to appear in the given event list (must be the very next event). public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List events, float timeout = MaxNetworkEventWaitTime) { - int initialCount = events.Count; - float startTime = Time.realtimeSinceStartup; - - while (Time.realtimeSinceStartup - startTime < timeout) + var initialCount = events.Count; + var startTime = Time.realtimeSinceStartup + timeout; + var waitPeriod = new WaitForSeconds(0.01f); + var conditionMet = false; + while (startTime > Time.realtimeSinceStartup) { if (events.Count > initialCount) { Assert.AreEqual(type, events[initialCount].Type); - yield break; + conditionMet = true; + break; } - yield return new WaitForSeconds(0.01f); + yield return waitPeriod; + } + if (!conditionMet) + { + Assert.Fail("Timed out while waiting for network event."); } + } - Assert.Fail("Timed out while waiting for network event."); + public static IEnumerator WaitForMultipleNetworkEvents(NetworkEvent type, List events, int count, float timeout = MaxNetworkEventWaitTime) + { + var initialCount = events.Count; + var startTime = Time.realtimeSinceStartup + timeout; + var waitPeriod = new WaitForSeconds(0.01f); + var conditionMet = false; + while (startTime > Time.realtimeSinceStartup) + { + // Wait until we have received at least (count) number of events + if ((events.Count - initialCount) >= count) + { + var foundTypes = 0; + // Look through all events received to match against the type we + // are looking for. + for (int i = initialCount; i < initialCount + count; i++) + { + if (type.Equals(events[i].Type)) + { + foundTypes++; + } + } + // If we reached the number of events we were expecting + conditionMet = foundTypes == count; + if (conditionMet) + { + // break from the wait loop + break; + } + } + + yield return waitPeriod; + } + if (!conditionMet) + { + Assert.Fail("Timed out while waiting for network event."); + } } // Wait to ensure no event is sent. @@ -55,9 +97,12 @@ public static IEnumerator EnsureNoNetworkEvent(List events, floa // Common code to initialize a UnityTransport that logs its events. public static void InitializeTransport(out UnityTransport transport, out List events, - int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4) + int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, string identifier = "") { - var logger = new TransportEventLogger(); + var logger = new TransportEventLogger() + { + Identifier = identifier, + }; events = logger.Events; transport = new GameObject().AddComponent(); @@ -74,6 +119,16 @@ public static void InitializeTransport(out UnityTransport transport, out List m_Events = new List(); public List Events => m_Events; + public string Identifier; public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment data, float receiveTime) { + VerboseLog($"[{Identifier}]Tansport Event][{type}][{receiveTime}] Client-{clientID}"); // Copy the data since the backing array will be reused for future messages. if (data != default(ArraySegment)) { diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef b/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef index 72d85ca4c5..642f0dd3bc 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef +++ b/com.unity.netcode.gameobjects/Tests/Runtime/com.unity.netcode.runtimetests.asmdef @@ -53,6 +53,16 @@ "name": "com.unity.transport", "expression": "2.0.0-exp", "define": "UTP_TRANSPORT_2_0_ABOVE" + }, + { + "name": "com.unity.transport", + "expression": "2.4.0", + "define": "UTP_TRANSPORT_2_4_ABOVE" + }, + { + "name": "Unity", + "expression": "6000.1.0a1", + "define": "HOSTNAME_RESOLUTION_AVAILABLE" } ], "noEngineReferences": false From 9b67dd77e54fd61025992180498d57001f2e9dce Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 8 May 2025 15:09:47 -0500 Subject: [PATCH 06/12] test Increasing disconnect timeout period to account for a system running slower than expected. --- .../Tests/Runtime/Transports/UnityTransportConnectionTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs index 4db30bf85b..7daa7495f0 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs @@ -214,7 +214,7 @@ public IEnumerator ClientDisconnectMultipleClients() VerboseLog($"Disconnecting Client-1"); m_Clients[0].DisconnectLocalClient(); - yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents, 1); + yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents, 5); // Disconnect all the other clients. for (int i = 1; i < k_NumClients; i++) From 788463d1fbb49304dbd84edc45e23efd6f046faf Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 8 May 2025 15:23:20 -0500 Subject: [PATCH 07/12] fix Re-arranging parameters and permission level of the two InitializeTransport methods. --- .../Runtime/Transports/UnityTransportTestHelpers.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs index 2a37e51e44..9f731ea7dd 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs @@ -96,9 +96,17 @@ public static IEnumerator EnsureNoNetworkEvent(List events, floa } // Common code to initialize a UnityTransport that logs its events. - public static void InitializeTransport(out UnityTransport transport, out List events, - int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, string identifier = "") + public static void InitializeTransport(out UnityTransport transport, out List events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4) { + InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family); + } + + /// + /// Interanl version with identifier parameter + /// + internal static void InitializeTransport(out UnityTransport transport, out List events, string identifier, + int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4) + { var logger = new TransportEventLogger() { Identifier = identifier, From 31e2f741db60ebe664c38d175113fa8916f61e26 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 8 May 2025 15:38:20 -0500 Subject: [PATCH 08/12] style - PVP Changing some new public things to internal things. --- .../Tests/Runtime/Transports/UnityTransportTestHelpers.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs index 9f731ea7dd..53b602405f 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs @@ -127,9 +127,9 @@ internal static void InitializeTransport(out UnityTransport transport, out List< transport.Initialize(); } - public static bool VerboseDebug = false; + internal static bool VerboseDebug = false; - public static void VerboseLog(string msg) + internal static void VerboseLog(string msg) { if (VerboseDebug) { @@ -153,7 +153,7 @@ public class TransportEventLogger { private readonly List m_Events = new List(); public List Events => m_Events; - public string Identifier; + internal string Identifier; public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment data, float receiveTime) { VerboseLog($"[{Identifier}]Tansport Event][{type}][{receiveTime}] Client-{clientID}"); From 3a017da011d9bd4318052d4538fd7d8f17f7cd1b Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 8 May 2025 15:59:12 -0500 Subject: [PATCH 09/12] style - pvp one more PVP public issue... >.< (p....v.....p) --- .../Tests/Runtime/Transports/UnityTransportTestHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs index 53b602405f..2a0caa88d4 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs @@ -40,7 +40,7 @@ public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List events, int count, float timeout = MaxNetworkEventWaitTime) + internal static IEnumerator WaitForMultipleNetworkEvents(NetworkEvent type, List events, int count, float timeout = MaxNetworkEventWaitTime) { var initialCount = events.Count; var startTime = Time.realtimeSinceStartup + timeout; From 592ad73f4f3a60123fa4f083d56abdc2a63d6678 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 8 May 2025 16:42:59 -0500 Subject: [PATCH 10/12] style removing whitespaces --- .../Tests/Runtime/Transports/UnityTransportTestHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs index 2a0caa88d4..2bade280fb 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs @@ -106,7 +106,7 @@ public static void InitializeTransport(out UnityTransport transport, out List internal static void InitializeTransport(out UnityTransport transport, out List events, string identifier, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4) - { + { var logger = new TransportEventLogger() { Identifier = identifier, From c91d0a89d9ccbbd21ede2305ff7a53ff50bb4104 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Thu, 15 May 2025 11:54:43 -0500 Subject: [PATCH 11/12] update Adjustments made to ConnectionAddressData and adjustments to tests. --- .../Runtime/Transports/UTP/UnityTransport.cs | 61 ++++++++++++------- .../Editor/Transports/UnityTransportTests.cs | 6 +- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index 034febf2e1..811ee3e73f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -313,30 +313,41 @@ public struct ConnectionAddressData [SerializeField] public string ServerListenAddress; - private static NetworkEndpoint ParseNetworkEndpoint(string ip, ushort port, bool silent = false) + private static NetworkEndpoint ParseNetworkEndpoint(string ip, ushort port) { NetworkEndpoint endpoint = default; - - if (!NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv4) && - !NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv6)) + if (!NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv4)) { -#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE - return default; -#else // If the user does not have the most recent version of UnityTransport installed - if (!silent) - { - Debug.LogError($"Invalid network endpoint: {ip}:{port}."); - } -#endif + NetworkEndpoint.TryParse(ip, port, out endpoint, NetworkFamily.Ipv6); } - return endpoint; } + private void InvalidEndpointError() + { + Debug.LogError($"Invalid network endpoint: {Address}:{Port}."); + } + /// /// Endpoint (IP address and port) clients will connect to. /// - public NetworkEndpoint ServerEndPoint => ParseNetworkEndpoint(Address, Port); + public NetworkEndpoint ServerEndPoint + { + get + { + var networkEndpoint = ParseNetworkEndpoint(Address, Port); + if (networkEndpoint == default) + { +#if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE + if (!IsValidFqdn(Address)) +#endif + { + InvalidEndpointError(); + } + } + return networkEndpoint; + } + } /// /// Endpoint (IP address and port) server will listen/bind on. @@ -345,27 +356,35 @@ public NetworkEndpoint ListenEndPoint { get { + NetworkEndpoint endpoint = default; if (string.IsNullOrEmpty(ServerListenAddress)) { - var ep = NetworkEndpoint.LoopbackIpv4; + endpoint = NetworkEndpoint.LoopbackIpv4; // If an address was entered and it's IPv6, switch to using ::1 as the // default listen address. (Otherwise we always assume IPv4.) if (!string.IsNullOrEmpty(Address) && ServerEndPoint.Family == NetworkFamily.Ipv6) { - ep = NetworkEndpoint.LoopbackIpv6; + endpoint = NetworkEndpoint.LoopbackIpv6; } - - return ep.WithPort(Port); + endpoint = endpoint.WithPort(Port); } else { - return ParseNetworkEndpoint(ServerListenAddress, Port); + endpoint = ParseNetworkEndpoint(ServerListenAddress, Port); + if (endpoint == default) + { + InvalidEndpointError(); + } } + return endpoint; } } - public bool IsIpv6 => !string.IsNullOrEmpty(Address) && ParseNetworkEndpoint(Address, Port, true).Family == NetworkFamily.Ipv6; + /// + /// Returns true if the end point address is of type . + /// + public bool IsIpv6 => !string.IsNullOrEmpty(Address) && NetworkEndpoint.TryParse(Address, Port, out NetworkEndpoint _, NetworkFamily.Ipv6); } @@ -525,7 +544,7 @@ private NetworkPipeline SelectSendPipeline(NetworkDelivery delivery) } #if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE - private bool IsValidFqdn(string fqdn) + private static IsValidFqdn(string fqdn) { // Regular expression to validate FQDN string pattern = @"^(?=.{1,255}$)(?!-)[A-Za-z0-9-]{1,63}(? Date: Thu, 15 May 2025 13:05:12 -0500 Subject: [PATCH 12/12] fix Missed the bool --- .../Runtime/Transports/UTP/UnityTransport.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index 811ee3e73f..2665214c9f 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -544,7 +544,7 @@ private NetworkPipeline SelectSendPipeline(NetworkDelivery delivery) } #if HOSTNAME_RESOLUTION_AVAILABLE && UTP_TRANSPORT_2_4_ABOVE - private static IsValidFqdn(string fqdn) + private static bool IsValidFqdn(string fqdn) { // Regular expression to validate FQDN string pattern = @"^(?=.{1,255}$)(?!-)[A-Za-z0-9-]{1,63}(?