Skip to content

Commit dcaeef9

Browse files
fix: provide users ability to get client endpoint backport (#3131)
* fix Adding method so users can obtain endpoint information about a client's connection. * test Validation test for the GetEndpoint method to assure it returns valid endpoint information. * fix Fixing missed issue with NetworkManagerTests * update adding changelog entry. * style removing white spaces
1 parent 0c32e93 commit dcaeef9

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1010

1111
### Added
1212

13+
- Added `UnityTransport.GetEndpoint` method to provide a way to obtain `NetworkEndpoint` information of a connection via client identifier. (#3131)
1314
- Added a static `NetworkManager.OnInstantiated` event notification to be able to track when a new `NetworkManager` instance has been instantiated. (#3089)
1415
- Added a static `NetworkManager.OnDestroying` event notification to be able to track when an existing `NetworkManager` instance is being destroyed. (#3089)
1516
- Added message size validation to named and unnamed message sending functions for better error messages. (#3043)

com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs

+24
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,30 @@ public override ulong GetCurrentRtt(ulong clientId)
12091209
return (ulong)ExtractRtt(ParseClientId(clientId));
12101210
}
12111211

1212+
/// <summary>
1213+
/// Provides the <see cref="NetworkEndpoint"/> for the NGO client identifier specified.
1214+
/// </summary>
1215+
/// <remarks>
1216+
/// - This is only really useful for direct connections.
1217+
/// - Relay connections and clients connected using a distributed authority network topology will not provide the client's actual endpoint information.
1218+
/// - For LAN topologies this should work as long as it is a direct connection and not a relay connection.
1219+
/// </remarks>
1220+
/// <param name="clientId">NGO client identifier to get endpoint information about.</param>
1221+
/// <returns><see cref="NetworkEndpoint"/></returns>
1222+
public NetworkEndpoint GetEndpoint(ulong clientId)
1223+
{
1224+
if (m_Driver.IsCreated && NetworkManager != null && NetworkManager.IsListening)
1225+
{
1226+
var transportId = NetworkManager.ConnectionManager.ClientIdToTransportId(clientId);
1227+
var networkConnection = ParseClientId(transportId);
1228+
if (m_Driver.GetConnectionState(networkConnection) == NetworkConnection.State.Connected)
1229+
{
1230+
return m_Driver.RemoteEndPoint(networkConnection);
1231+
}
1232+
}
1233+
return new NetworkEndpoint();
1234+
}
1235+
12121236
/// <summary>
12131237
/// Initializes the transport
12141238
/// </summary>

com.unity.netcode.gameobjects/Tests/Runtime/NetworkManagerTransportTests.cs

+50
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System;
22
using System.Collections;
33
using NUnit.Framework;
4+
using Unity.Netcode.TestHelpers.Runtime;
5+
using Unity.Netcode.Transports.UTP;
6+
using Unity.Networking.Transport;
47
using UnityEngine;
58
using UnityEngine.TestTools;
69

@@ -157,4 +160,51 @@ public override void DisconnectLocalClient()
157160
}
158161
}
159162
}
163+
164+
/// <summary>
165+
/// Verifies the UnityTransport.GetEndpoint method returns
166+
/// valid NetworkEndPoint information.
167+
/// </summary>
168+
internal class TransportEndpointTests : NetcodeIntegrationTest
169+
{
170+
protected override int NumberOfClients => 2;
171+
172+
[UnityTest]
173+
public IEnumerator GetEndpointReportedCorrectly()
174+
{
175+
var serverUnityTransport = m_ServerNetworkManager.NetworkConfig.NetworkTransport as UnityTransport;
176+
var serverEndpoint = new NetworkEndPoint();
177+
var clientEndpoint = new NetworkEndPoint();
178+
foreach (var client in m_ClientNetworkManagers)
179+
{
180+
var unityTransport = client.NetworkConfig.NetworkTransport as UnityTransport;
181+
serverEndpoint = unityTransport.GetEndpoint(m_ServerNetworkManager.LocalClientId);
182+
clientEndpoint = serverUnityTransport.GetEndpoint(client.LocalClientId);
183+
Assert.IsTrue(serverEndpoint.IsValid);
184+
Assert.IsTrue(clientEndpoint.IsValid);
185+
Assert.IsTrue(clientEndpoint.Address.Split(":")[0] == unityTransport.ConnectionData.Address);
186+
Assert.IsTrue(serverEndpoint.Address.Split(":")[0] == serverUnityTransport.ConnectionData.Address);
187+
Assert.IsTrue(serverEndpoint.Port == unityTransport.ConnectionData.Port);
188+
Assert.IsTrue(clientEndpoint.Port >= serverUnityTransport.ConnectionData.Port);
189+
}
190+
191+
// Now validate that when disconnected it returns a non-valid NetworkEndPoint
192+
var clientId = m_ClientNetworkManagers[0].LocalClientId;
193+
m_ClientNetworkManagers[0].Shutdown();
194+
yield return s_DefaultWaitForTick;
195+
196+
serverEndpoint = (m_ClientNetworkManagers[0].NetworkConfig.NetworkTransport as UnityTransport).GetEndpoint(m_ServerNetworkManager.LocalClientId);
197+
clientEndpoint = serverUnityTransport.GetEndpoint(clientId);
198+
Assert.IsFalse(serverEndpoint.IsValid);
199+
Assert.IsFalse(clientEndpoint.IsValid);
200+
201+
// Validate that invalid client identifiers return an invalid NetworkEndPoint
202+
serverEndpoint = (m_ClientNetworkManagers[0].NetworkConfig.NetworkTransport as UnityTransport).GetEndpoint((ulong)UnityEngine.Random.Range(NumberOfClients + 1, 30));
203+
clientEndpoint = serverUnityTransport.GetEndpoint((ulong)UnityEngine.Random.Range(NumberOfClients + 1, 30));
204+
Assert.IsFalse(serverEndpoint.IsValid);
205+
Assert.IsFalse(clientEndpoint.IsValid);
206+
}
207+
}
208+
209+
160210
}

testproject/Assets/Tests/Runtime/NetworkManagerTests.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public enum UseSceneManagement
2222
SceneManagementDisabled
2323
}
2424

25-
private bool m_EnableSceneManagement;
2625
private NetworkObject m_NetworkObject;
2726
private bool m_NetworkObjectWasSpawned;
2827
private bool m_NetworkBehaviourIsHostWasSet;
@@ -85,7 +84,7 @@ protected override IEnumerator OnTearDown()
8584

8685
protected override void OnServerAndClientsCreated()
8786
{
88-
m_ServerNetworkManager.NetworkConfig.EnableSceneManagement = m_EnableSceneManagement;
87+
m_ServerNetworkManager.NetworkConfig.EnableSceneManagement = m_UseSceneManagement;
8988
m_NetworkObjectTestComponent.ConfigureClientConnected(m_ServerNetworkManager, OnClientConnectedCallback);
9089
}
9190

@@ -108,7 +107,7 @@ public enum ShutdownChecks
108107

109108
protected override void OnNewClientCreated(NetworkManager networkManager)
110109
{
111-
networkManager.NetworkConfig.EnableSceneManagement = m_EnableSceneManagement;
110+
networkManager.NetworkConfig.EnableSceneManagement = m_UseSceneManagement;
112111
foreach (var prefab in m_ServerNetworkManager.NetworkConfig.Prefabs.Prefabs)
113112
{
114113
networkManager.NetworkConfig.Prefabs.Add(prefab);

0 commit comments

Comments
 (0)