Skip to content

Commit e28c904

Browse files
Update
Adding some final adjustments and (hopefully) improving the disconnect event messaging upon a local client or server shutting down.
1 parent e02cad1 commit e28c904

File tree

4 files changed

+82
-21
lines changed

4 files changed

+82
-21
lines changed

com.unity.netcode.gameobjects/Runtime/Connection/NetworkConnectionManager.cs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -528,12 +528,17 @@ private void GenerateDisconnectInformation(ulong clientId, ulong transportClient
528528
{
529529
var header = $"[Disconnect Event][Client-{clientId}]";
530530
var existingDisconnectReason = DisconnectReason;
531-
var defaultMessage = reason ?? $"Disconnected.";
531+
532+
var defaultMessage = Transport.DisconnectEventMessage;
533+
if (reason != null)
534+
{
535+
defaultMessage = $"{reason} {defaultMessage}";
536+
}
532537
// Just go ahead and set this whether client or server so any subscriptions to a disconnect event can check the DisconnectReason
533538
// to determine why the client disconnected
534-
DisconnectReason = Transport.DisconnectEvent == NetworkTransport.DisconnectEvents.Disconnected ? $"{header} {defaultMessage}" :
535-
$"{header}[{Transport.DisconnectEvent}] {defaultMessage}";
539+
DisconnectReason = $"{header}[{Transport.DisconnectEvent}] {defaultMessage}";
536540
DisconnectReason = $"{DisconnectReason}\n{existingDisconnectReason}";
541+
537542
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
538543
{
539544
NetworkLog.LogInfo($"{DisconnectReason}");
@@ -558,7 +563,13 @@ internal void DisconnectEventHandler(ulong transportClientId)
558563
clientId = NetworkManager.LocalClientId;
559564
}
560565

561-
GenerateDisconnectInformation(clientId, transportClientId);
566+
// If the disconnect is due to the transport being shutdown and we have received a notification
567+
// from transport that we have disconnected, then we are a client that has shutdown the NetworkManager
568+
// and there is no need to generate any disconnect information as all of that should already be set at this point.
569+
if (Transport.DisconnectEvent != NetworkTransport.DisconnectEvents.TransportShutdown)
570+
{
571+
GenerateDisconnectInformation(clientId, transportClientId);
572+
}
562573

563574
// Process the incoming message queue so that we get everything from the server disconnecting us or, if we are the server, so we got everything from that client.
564575
MessageManager.ProcessIncomingMessageQueue();
@@ -1412,8 +1423,8 @@ internal void DisconnectClient(ulong clientId, string reason = null)
14121423
};
14131424
SendMessage(ref disconnectReason, NetworkDelivery.Reliable, clientId);
14141425
}
1415-
Transport.SetDisconnectEvent((byte)Networking.Transport.Error.DisconnectReason.Default);
14161426

1427+
Transport.ClosingRemoteConnection();
14171428
GenerateDisconnectInformation(clientId, ClientIdToTransportId(clientId), reason);
14181429
DisconnectRemoteClient(clientId);
14191430
}
@@ -1457,6 +1468,14 @@ internal void Initialize(NetworkManager networkManager)
14571468
/// </summary>
14581469
internal void Shutdown()
14591470
{
1471+
if (Transport && IsListening)
1472+
{
1473+
var clientId = NetworkManager ? NetworkManager.LocalClientId : NetworkManager.ServerClientId;
1474+
var transportId = ClientIdToTransportId(clientId);
1475+
Transport.SetDisconnectEvent(NetworkTransport.DisconnectEvents.TransportShutdown);
1476+
GenerateDisconnectInformation(clientId, transportId, $"{nameof(NetworkConnectionManager)} was shutdown.");
1477+
}
1478+
14601479
if (LocalClient.IsServer)
14611480
{
14621481
// Build a list of all client ids to be disconnected
@@ -1506,7 +1525,8 @@ internal void Shutdown()
15061525
// Client only, send disconnect and if transport throws and exception, log the exception and continue the shutdown sequence (or forever be shutting down)
15071526
try
15081527
{
1509-
Transport.DisconnectLocalClient();
1528+
Transport?.DisconnectLocalClient();
1529+
Transport?.CleanDisconnectEventMap();
15101530
}
15111531
catch (Exception ex)
15121532
{
@@ -1536,13 +1556,8 @@ internal void Shutdown()
15361556
var transport = NetworkManager.NetworkConfig?.NetworkTransport;
15371557
if (transport != null)
15381558
{
1539-
if (LocalClient.IsServer)
1540-
{
1541-
GenerateDisconnectInformation(NetworkManager.ServerClientId, Transport.ServerClientId, "Disconnecting due to shutdown.");
1542-
}
15431559
transport.CleanDisconnectEventMap();
15441560
transport.Shutdown();
1545-
15461561
if (NetworkManager.LogLevel <= LogLevel.Developer)
15471562
{
15481563
NetworkLog.LogInfo($"{nameof(NetworkConnectionManager)}.{nameof(Shutdown)}() -> {nameof(IsListening)} && {nameof(NetworkManager.NetworkConfig.NetworkTransport)} != null -> {nameof(NetworkTransport)}.{nameof(NetworkTransport.Shutdown)}()");

com.unity.netcode.gameobjects/Runtime/Transports/NetworkTransport.cs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ internal NetworkTopologyTypes CurrentTopology()
169169

170170
public enum DisconnectEvents : byte
171171
{
172+
TransportShutdown,
172173
Disconnected,
173174
ProtocolTimeout,
174175
MaxConnectionAttempts,
@@ -179,14 +180,17 @@ public enum DisconnectEvents : byte
179180
}
180181

181182
public DisconnectEvents DisconnectEvent { get; private set; }
183+
public string DisconnectEventMessage { get; private set; }
184+
182185
private Dictionary<byte, DisconnectEvents> m_DisconnectEventMap = new Dictionary<byte, DisconnectEvents>();
186+
private Dictionary<DisconnectEvents, string> m_DisconnectEventMessageMap = new Dictionary<DisconnectEvents, string>();
183187

184188
/// <summary>
185189
/// This should be invoked by the <see cref="NetworkTransport"/> derived class when a transport level disconnect event occurs.<br />
186190
/// If there is a map for the specific transport event id, then <see cref="DisconnectEvent"/> will be set to the equivalent <see cref="DisconnectEvents"/> value.
187191
/// </summary>
188192
/// <param name="disconnectEventId">The transport's disconnect event identifer.</param>
189-
public void SetDisconnectEvent(byte disconnectEventId)
193+
public void SetDisconnectEvent(byte disconnectEventId, string message = null)
190194
{
191195
if (m_DisconnectEventMap.ContainsKey(disconnectEventId))
192196
{
@@ -196,24 +200,48 @@ public void SetDisconnectEvent(byte disconnectEventId)
196200
{
197201
DisconnectEvent = DisconnectEvents.Disconnected;
198202
}
203+
DisconnectEventMessage = string.Empty;
204+
if (message != null)
205+
{
206+
DisconnectEventMessage = message;
207+
}
208+
else if (m_DisconnectEventMessageMap.ContainsKey(DisconnectEvent))
209+
{
210+
DisconnectEventMessage = m_DisconnectEventMessageMap[DisconnectEvent];
211+
}
199212
}
200213

201-
internal void SetDisconnectEvent(DisconnectEvents disconnectEvent)
214+
internal void SetDisconnectEvent(DisconnectEvents disconnectEvent, string message = null)
202215
{
203216
DisconnectEvent = disconnectEvent;
217+
DisconnectEventMessage = string.Empty;
218+
if (message != null)
219+
{
220+
DisconnectEventMessage = message;
221+
}
222+
else if (m_DisconnectEventMessageMap.ContainsKey(disconnectEvent))
223+
{
224+
DisconnectEventMessage = m_DisconnectEventMessageMap[disconnectEvent];
225+
}
204226
}
205227

206228
/// <summary>
207229
/// Adds a map between the <see cref="DisconnectEvents"/> value and the transports equivalent event identifier.
208230
/// </summary>
209231
/// <param name="disconnectEvents">The <see cref="DisconnectEvents"/> value to be mapped.</param>
210232
/// <param name="targetEventId">The transport's equivalent event identifier value.</param>
211-
protected void AddDisconnectEventMap(DisconnectEvents disconnectEvents, byte targetEventId)
233+
/// <param name="message">Optional message to use for this disconnect event.</param>
234+
protected void AddDisconnectEventMap(DisconnectEvents disconnectEvents, byte targetEventId, string message = null)
212235
{
213236
if (!m_DisconnectEventMap.ContainsKey(targetEventId))
214237
{
215238
m_DisconnectEventMap.Add(targetEventId, disconnectEvents);
216239
}
240+
241+
if (message != null && !m_DisconnectEventMessageMap.ContainsKey(disconnectEvents))
242+
{
243+
m_DisconnectEventMessageMap.Add(disconnectEvents, message);
244+
}
217245
}
218246

219247
/// <summary>
@@ -230,13 +258,21 @@ protected virtual void OnCreateDisconnectEventMap()
230258

231259
internal void CreateDisconnectEventMap()
232260
{
261+
DisconnectEvent = DisconnectEvents.Disconnected;
262+
DisconnectEventMessage = string.Empty;
233263
OnCreateDisconnectEventMap();
234264
}
235265

236266
internal void CleanDisconnectEventMap()
237267
{
238268
DisconnectEvent = DisconnectEvents.Disconnected;
239269
m_DisconnectEventMap.Clear();
270+
m_DisconnectEventMessageMap.Clear();
271+
}
272+
273+
internal void ClosingRemoteConnection()
274+
{
275+
SetDisconnectEvent(DisconnectEvents.ClosedRemoteConnection);
240276
}
241277
}
242278

com.unity.netcode.gameobjects/Runtime/Transports/SinglePlayer/SinglePlayerTransport.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ private struct MessageData
2828

2929
private static Dictionary<ulong, Queue<MessageData>> s_MessageQueue = new Dictionary<ulong, Queue<MessageData>>();
3030

31-
private bool m_Initialized;
3231
private ulong m_TransportId = 0;
3332
private NetworkManager m_NetworkManager;
3433

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,14 +1368,25 @@ public override void DisconnectRemoteClient(ulong clientId)
13681368
}
13691369
}
13701370

1371+
private const byte k_ClosedRemoteConnection = 128;
1372+
private const byte k_TransportShutdown = 129;
1373+
1374+
/// <inheritdoc/>
13711375
protected override void OnCreateDisconnectEventMap()
13721376
{
1373-
AddDisconnectEventMap(DisconnectEvents.Disconnected, (byte)DisconnectReason.Default);
1374-
AddDisconnectEventMap(DisconnectEvents.ProtocolTimeout, (byte)DisconnectReason.Timeout);
1375-
AddDisconnectEventMap(DisconnectEvents.MaxConnectionAttempts, (byte)DisconnectReason.MaxConnectionAttempts);
1376-
AddDisconnectEventMap(DisconnectEvents.ClosedByRemote, (byte)DisconnectReason.ClosedByRemote);
1377-
AddDisconnectEventMap(DisconnectEvents.AuthenticationFailure, (byte)DisconnectReason.AuthenticationFailure);
1378-
AddDisconnectEventMap(DisconnectEvents.ProtocolError, (byte)DisconnectReason.ProtocolError);
1377+
// Implemented in UTP
1378+
1379+
AddDisconnectEventMap(DisconnectEvents.Disconnected, (byte)DisconnectReason.Default, "Gracefully disconnected.");
1380+
AddDisconnectEventMap(DisconnectEvents.ProtocolTimeout, (byte)DisconnectReason.Timeout, "Connection timed out.");
1381+
AddDisconnectEventMap(DisconnectEvents.MaxConnectionAttempts, (byte)DisconnectReason.MaxConnectionAttempts, "Maximum connection attempts reached.");
1382+
AddDisconnectEventMap(DisconnectEvents.ClosedByRemote, (byte)DisconnectReason.ClosedByRemote, "Remote connection was closed.");
1383+
AddDisconnectEventMap(DisconnectEvents.AuthenticationFailure, (byte)DisconnectReason.AuthenticationFailure, "Authentication failed.");
1384+
AddDisconnectEventMap(DisconnectEvents.ProtocolError, (byte)DisconnectReason.ProtocolError, "Transport protocol error encountered.");
1385+
1386+
// Not implemented in UTP
1387+
AddDisconnectEventMap(DisconnectEvents.ClosedRemoteConnection, k_ClosedRemoteConnection, "Local transport closed the remote connection.");
1388+
AddDisconnectEventMap(DisconnectEvents.TransportShutdown, k_TransportShutdown, "The transport was shutdown.");
1389+
13791390
base.OnCreateDisconnectEventMap();
13801391
}
13811392

0 commit comments

Comments
 (0)