Skip to content

Commit 90f97fd

Browse files
fix: provide users ability to get client endpoint (#3130)
* fix Adding GetEndpoint method so users can get endpoint connection info from an NGO client identifier. * test adding test to validate the GetEndpoint method addition. * test fixing issue with NetworkManagerTests not using the right property. * update adding change log entry
1 parent 72e4f20 commit 90f97fd

File tree

4 files changed

+75
-3
lines changed

4 files changed

+75
-3
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
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. (#3130)
1314
- Added `NetworkTransport.OnEarlyUpdate` and `NetworkTransport.OnPostLateUpdate` methods to provide more control over handling transport related events at the start and end of each frame. (#3113)
1415

1516
### Fixed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,30 @@ public override ulong GetCurrentRtt(ulong clientId)
12621262
return (ulong)ExtractRtt(ParseClientId(clientId));
12631263
}
12641264

1265+
/// <summary>
1266+
/// Provides the <see cref="NetworkEndpoint"/> for the NGO client identifier specified.
1267+
/// </summary>
1268+
/// <remarks>
1269+
/// - This is only really useful for direct connections.
1270+
/// - Relay connections and clients connected using a distributed authority network topology will not provide the client's actual endpoint information.
1271+
/// - For LAN topologies this should work as long as it is a direct connection and not a relay connection.
1272+
/// </remarks>
1273+
/// <param name="clientId">NGO client identifier to get endpoint information about.</param>
1274+
/// <returns><see cref="NetworkEndpoint"/></returns>
1275+
public NetworkEndpoint GetEndpoint(ulong clientId)
1276+
{
1277+
if (m_Driver.IsCreated && m_NetworkManager != null && m_NetworkManager.IsListening)
1278+
{
1279+
var transportId = m_NetworkManager.ConnectionManager.ClientIdToTransportId(clientId);
1280+
var networkConnection = ParseClientId(transportId);
1281+
if (m_Driver.GetConnectionState(networkConnection) == NetworkConnection.State.Connected)
1282+
{
1283+
return m_Driver.GetRemoteEndpoint(networkConnection);
1284+
}
1285+
}
1286+
return new NetworkEndpoint();
1287+
}
1288+
12651289
/// <summary>
12661290
/// Initializes the transport
12671291
/// </summary>

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

Lines changed: 48 additions & 0 deletions
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,49 @@ 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+
}
160208
}

testproject/Assets/Tests/Runtime/NetworkManagerTests.cs

Lines changed: 2 additions & 3 deletions
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)