From 7aa9ce100ac2705093024414b5faf4b93e2a6c04 Mon Sep 17 00:00:00 2001 From: Emma Date: Tue, 4 Mar 2025 13:19:11 -0500 Subject: [PATCH 1/3] fix: Block websocket use in dedicated server builds --- .../Runtime/Transports/UTP/UnityTransport.cs | 129 ++++++++++-------- 1 file changed, 71 insertions(+), 58 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index f8db2e30d9..f49532814c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -1668,6 +1668,21 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, } #endif +#if UNITY_SERVER + if (m_ProtocolType == ProtocolType.RelayUnityTransport) + { + if (m_UseWebSockets) + { + Debug.LogError("Transport is configured to use Websockets, but websockets are not available on server builds. Ensure that the \"Use WebSockets\" checkbox is checked under \"Unity Transport\" component."); + } + + if (m_RelayServerData.IsWebSocket != 0) + { + Debug.LogError("Relay server data indicates usage of WebSockets, but websockets are not available on server builds. Be sure to use \"dtls\" or \"udp\" as the connection type when creating the server data"); + } + } +#endif + #if UTP_TRANSPORT_2_0_ABOVE if (m_UseEncryption) { @@ -1713,24 +1728,22 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, #endif #if UTP_TRANSPORT_2_1_ABOVE - if (m_ProtocolType == ProtocolType.RelayUnityTransport) + if (m_UseWebSockets && m_RelayServerData.IsWebSocket == 0) { - if (m_UseWebSockets && m_RelayServerData.IsWebSocket == 0) - { - Debug.LogError("Transport is configured to use WebSockets, but Relay server data isn't. Be sure to use \"wss\" as the connection type when creating the server data (instead of \"dtls\" or \"udp\")."); - } + Debug.LogError("Transport is configured to use WebSockets, but Relay server data isn't. Be sure to use \"wss\" as the connection type when creating the server data (instead of \"dtls\" or \"udp\")."); + } - if (!m_UseWebSockets && m_RelayServerData.IsWebSocket != 0) - { - Debug.LogError("Relay server data indicates usage of WebSockets, but \"Use WebSockets\" checkbox isn't checked under \"Unity Transport\" component."); - } + if (!m_UseWebSockets && m_RelayServerData.IsWebSocket != 0) + { + Debug.LogError("Relay server data indicates usage of WebSockets, but \"Use WebSockets\" checkbox isn't checked under \"Unity Transport\" component."); } + } #endif #if UTP_TRANSPORT_2_0_ABOVE if (m_UseWebSockets) { - driver = NetworkDriver.Create(new WebSocketNetworkInterface(), m_NetworkSettings); + driver = NetworkDriver.Create(private new WebSocketNetworkInterface(), m_NetworkSettings); } else { @@ -1738,7 +1751,7 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, Debug.LogWarning($"WebSockets were used even though they're not selected in NetworkManager. You should check {nameof(UseWebSockets)}', on the Unity Transport component, to silence this warning."); driver = NetworkDriver.Create(new WebSocketNetworkInterface(), m_NetworkSettings); #else - driver = NetworkDriver.Create(new UDPNetworkInterface(), m_NetworkSettings); + driver = NetworkDriver.Create(private new UDPNetworkInterface(), m_NetworkSettings); #endif } #else @@ -1755,10 +1768,10 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, out unreliableSequencedFragmentedPipeline, out reliableSequencedPipeline); #else - SetupPipelinesForUtp2(driver, - out unreliableFragmentedPipeline, - out unreliableSequencedFragmentedPipeline, - out reliableSequencedPipeline); +SetupPipelinesForUtp2(driver, + out unreliableFragmentedPipeline, + out unreliableSequencedFragmentedPipeline, + out reliableSequencedPipeline); #endif } @@ -1826,74 +1839,74 @@ private void SetupPipelinesForUtp2(NetworkDriver driver, out NetworkPipeline unreliableFragmentedPipeline, out NetworkPipeline unreliableSequencedFragmentedPipeline, out NetworkPipeline reliableSequencedPipeline) - { +{ - unreliableFragmentedPipeline = driver.CreatePipeline( - typeof(FragmentationPipelineStage) + unreliableFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage) #if UNITY_MP_TOOLS_NETSIM_IMPLEMENTATION_ENABLED - , typeof(SimulatorPipelineStage) + , typeof(SimulatorPipelineStage) #endif #if MULTIPLAYER_TOOLS_1_0_0_PRE_7 , typeof(NetworkMetricsPipelineStage) #endif - ); + ); - unreliableSequencedFragmentedPipeline = driver.CreatePipeline( - typeof(FragmentationPipelineStage), - typeof(UnreliableSequencedPipelineStage) + unreliableSequencedFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage), + typeof(UnreliableSequencedPipelineStage) #if UNITY_MP_TOOLS_NETSIM_IMPLEMENTATION_ENABLED - , typeof(SimulatorPipelineStage) + , typeof(SimulatorPipelineStage) #endif #if MULTIPLAYER_TOOLS_1_0_0_PRE_7 , typeof(NetworkMetricsPipelineStage) #endif - ); + ); - reliableSequencedPipeline = driver.CreatePipeline( - typeof(ReliableSequencedPipelineStage) + reliableSequencedPipeline = driver.CreatePipeline( + typeof(ReliableSequencedPipelineStage) #if UNITY_MP_TOOLS_NETSIM_IMPLEMENTATION_ENABLED - , typeof(SimulatorPipelineStage) + , typeof(SimulatorPipelineStage) #endif #if MULTIPLAYER_TOOLS_1_0_0_PRE_7 , typeof(NetworkMetricsPipelineStage) #endif - ); - } + ); +} #endif - // -------------- Utility Types ------------------------------------------------------------------------------- +// -------------- Utility Types ------------------------------------------------------------------------------- - /// - /// Cached information about reliability mode with a certain client - /// - private struct SendTarget : IEquatable - { - public readonly ulong ClientId; - public readonly NetworkPipeline NetworkPipeline; +/// +/// Cached information about reliability mode with a certain client +/// +private struct SendTarget : IEquatable +{ + public readonly ulong ClientId; + public readonly NetworkPipeline NetworkPipeline; - public SendTarget(ulong clientId, NetworkPipeline networkPipeline) - { - ClientId = clientId; - NetworkPipeline = networkPipeline; - } + public SendTarget(ulong clientId, NetworkPipeline networkPipeline) + { + ClientId = clientId; + NetworkPipeline = networkPipeline; + } - public bool Equals(SendTarget other) - { - return ClientId == other.ClientId && NetworkPipeline.Equals(other.NetworkPipeline); - } + public bool Equals(SendTarget other) + { + return ClientId == other.ClientId && NetworkPipeline.Equals(other.NetworkPipeline); + } - public override bool Equals(object obj) - { - return obj is SendTarget other && Equals(other); - } + public override bool Equals(object obj) + { + return obj is SendTarget other && Equals(other); + } - public override int GetHashCode() - { - unchecked - { - return (ClientId.GetHashCode() * 397) ^ NetworkPipeline.GetHashCode(); - } - } + public override int GetHashCode() + { + unchecked + { + return (ClientId.GetHashCode() * 397) ^ NetworkPipeline.GetHashCode(); } } +} + } } From e227535291905c2fc8a0a0b2702bbaede8b419ef Mon Sep 17 00:00:00 2001 From: Emma Date: Tue, 4 Mar 2025 13:26:44 -0500 Subject: [PATCH 2/3] Update CHANGELOG.md --- com.unity.netcode.gameobjects/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.netcode.gameobjects/CHANGELOG.md b/com.unity.netcode.gameobjects/CHANGELOG.md index abc7731841..9a9a08bc6f 100644 --- a/com.unity.netcode.gameobjects/CHANGELOG.md +++ b/com.unity.netcode.gameobjects/CHANGELOG.md @@ -31,6 +31,7 @@ Additional documentation and release notes are available at [Multiplayer Documen ### Changed +- Ensured that a useful error is thrown when attempting to build a dedicated server with Unity Transport that uses websockets. (#3336) - Changed root in-scene placed `NetworkObject` instances now will always have either the `Distributable` permission set unless the `SessionOwner` permission is set. (#3305) - Changed the `DestroyObject` message to reduce the serialized message size and remove the unnecessary message field. (#3304) - Changed the `NetworkTimeSystem.Sync` method to use half RTT to calculate the desired local time offset as opposed to the full RTT. (#3212) From 489de7eee4175d07260d2779e77b1ff53aaf9d00 Mon Sep 17 00:00:00 2001 From: Emma Date: Tue, 4 Mar 2025 14:56:12 -0500 Subject: [PATCH 3/3] Remove unrelated changes --- .../Runtime/Transports/UTP/UnityTransport.cs | 114 +++++++++--------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs index f49532814c..f08e3cebaa 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs @@ -1728,22 +1728,24 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, #endif #if UTP_TRANSPORT_2_1_ABOVE - if (m_UseWebSockets && m_RelayServerData.IsWebSocket == 0) + if (m_ProtocolType == ProtocolType.RelayUnityTransport) { - Debug.LogError("Transport is configured to use WebSockets, but Relay server data isn't. Be sure to use \"wss\" as the connection type when creating the server data (instead of \"dtls\" or \"udp\")."); - } + if (m_UseWebSockets && m_RelayServerData.IsWebSocket == 0) + { + Debug.LogError("Transport is configured to use WebSockets, but Relay server data isn't. Be sure to use \"wss\" as the connection type when creating the server data (instead of \"dtls\" or \"udp\")."); + } - if (!m_UseWebSockets && m_RelayServerData.IsWebSocket != 0) - { - Debug.LogError("Relay server data indicates usage of WebSockets, but \"Use WebSockets\" checkbox isn't checked under \"Unity Transport\" component."); + if (!m_UseWebSockets && m_RelayServerData.IsWebSocket != 0) + { + Debug.LogError("Relay server data indicates usage of WebSockets, but \"Use WebSockets\" checkbox isn't checked under \"Unity Transport\" component."); + } } - } #endif #if UTP_TRANSPORT_2_0_ABOVE if (m_UseWebSockets) { - driver = NetworkDriver.Create(private new WebSocketNetworkInterface(), m_NetworkSettings); + driver = NetworkDriver.Create(new WebSocketNetworkInterface(), m_NetworkSettings); } else { @@ -1751,7 +1753,7 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, Debug.LogWarning($"WebSockets were used even though they're not selected in NetworkManager. You should check {nameof(UseWebSockets)}', on the Unity Transport component, to silence this warning."); driver = NetworkDriver.Create(new WebSocketNetworkInterface(), m_NetworkSettings); #else - driver = NetworkDriver.Create(private new UDPNetworkInterface(), m_NetworkSettings); + driver = NetworkDriver.Create(new UDPNetworkInterface(), m_NetworkSettings); #endif } #else @@ -1768,10 +1770,10 @@ public void CreateDriver(UnityTransport transport, out NetworkDriver driver, out unreliableSequencedFragmentedPipeline, out reliableSequencedPipeline); #else -SetupPipelinesForUtp2(driver, - out unreliableFragmentedPipeline, - out unreliableSequencedFragmentedPipeline, - out reliableSequencedPipeline); + SetupPipelinesForUtp2(driver, + out unreliableFragmentedPipeline, + out unreliableSequencedFragmentedPipeline, + out reliableSequencedPipeline); #endif } @@ -1839,74 +1841,74 @@ private void SetupPipelinesForUtp2(NetworkDriver driver, out NetworkPipeline unreliableFragmentedPipeline, out NetworkPipeline unreliableSequencedFragmentedPipeline, out NetworkPipeline reliableSequencedPipeline) -{ + { - unreliableFragmentedPipeline = driver.CreatePipeline( - typeof(FragmentationPipelineStage) + unreliableFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage) #if UNITY_MP_TOOLS_NETSIM_IMPLEMENTATION_ENABLED - , typeof(SimulatorPipelineStage) + , typeof(SimulatorPipelineStage) #endif #if MULTIPLAYER_TOOLS_1_0_0_PRE_7 , typeof(NetworkMetricsPipelineStage) #endif - ); + ); - unreliableSequencedFragmentedPipeline = driver.CreatePipeline( - typeof(FragmentationPipelineStage), - typeof(UnreliableSequencedPipelineStage) + unreliableSequencedFragmentedPipeline = driver.CreatePipeline( + typeof(FragmentationPipelineStage), + typeof(UnreliableSequencedPipelineStage) #if UNITY_MP_TOOLS_NETSIM_IMPLEMENTATION_ENABLED - , typeof(SimulatorPipelineStage) + , typeof(SimulatorPipelineStage) #endif #if MULTIPLAYER_TOOLS_1_0_0_PRE_7 , typeof(NetworkMetricsPipelineStage) #endif - ); + ); - reliableSequencedPipeline = driver.CreatePipeline( - typeof(ReliableSequencedPipelineStage) + reliableSequencedPipeline = driver.CreatePipeline( + typeof(ReliableSequencedPipelineStage) #if UNITY_MP_TOOLS_NETSIM_IMPLEMENTATION_ENABLED - , typeof(SimulatorPipelineStage) + , typeof(SimulatorPipelineStage) #endif #if MULTIPLAYER_TOOLS_1_0_0_PRE_7 , typeof(NetworkMetricsPipelineStage) #endif - ); -} + ); + } #endif -// -------------- Utility Types ------------------------------------------------------------------------------- + // -------------- Utility Types ------------------------------------------------------------------------------- -/// -/// Cached information about reliability mode with a certain client -/// -private struct SendTarget : IEquatable -{ - public readonly ulong ClientId; - public readonly NetworkPipeline NetworkPipeline; + /// + /// Cached information about reliability mode with a certain client + /// + private struct SendTarget : IEquatable + { + public readonly ulong ClientId; + public readonly NetworkPipeline NetworkPipeline; - public SendTarget(ulong clientId, NetworkPipeline networkPipeline) - { - ClientId = clientId; - NetworkPipeline = networkPipeline; - } + public SendTarget(ulong clientId, NetworkPipeline networkPipeline) + { + ClientId = clientId; + NetworkPipeline = networkPipeline; + } - public bool Equals(SendTarget other) - { - return ClientId == other.ClientId && NetworkPipeline.Equals(other.NetworkPipeline); - } + public bool Equals(SendTarget other) + { + return ClientId == other.ClientId && NetworkPipeline.Equals(other.NetworkPipeline); + } - public override bool Equals(object obj) - { - return obj is SendTarget other && Equals(other); - } + public override bool Equals(object obj) + { + return obj is SendTarget other && Equals(other); + } - public override int GetHashCode() - { - unchecked - { - return (ClientId.GetHashCode() * 397) ^ NetworkPipeline.GetHashCode(); + public override int GetHashCode() + { + unchecked + { + return (ClientId.GetHashCode() * 397) ^ NetworkPipeline.GetHashCode(); + } + } } } -} - } }