Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Fixed

- Fixed issue where maxCapacity calculation overflows if a developer sets a very, very high (large) m_DisconnectTimeoutMS in the Editor for Unity Transport. (#3810)
- Fixed issues with the "Client-server quickstart for Netcode for GameObjects" script having static methods and properties. (#3787)
- Fixed issue where a warning message was being logged upon a client disconnecting from a server when the log level is set to developer. (#3786)
- Fixed issue where the server or host would no longer have access to the transport id to client id table when processing a transport level client disconnect event. (#3786)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ internal struct BatchedSendQueue : IDisposable
public const int PerMessageOverhead = sizeof(int);

internal const int MinimumMinimumCapacity = 4096;
// int.MaxValue is odd and maximum must be even.
internal const int MaximumMaximumCapacity = int.MaxValue - 1;

// Indices into m_HeadTailIndicies.
private const int k_HeadInternalIndex = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1515,7 +1515,12 @@ public override void Send(ulong clientId, ArraySegment<byte> payload, NetworkDel
// the only case where a full send queue causes a connection loss. Full unreliable
// send queues are dealt with by flushing it out to the network or simply dropping
// new messages if that fails.
var maxCapacity = m_MaxSendQueueSize > 0 ? m_MaxSendQueueSize : m_DisconnectTimeoutMS * k_MaxReliableThroughput;
var maxCapacity = m_MaxSendQueueSize;
if (maxCapacity <= 0)
{
var fullCalculation = Math.BigMul(m_DisconnectTimeoutMS, k_MaxReliableThroughput);
maxCapacity = (int)Math.Min(fullCalculation, BatchedSendQueue.MaximumMaximumCapacity);
}

queue = new BatchedSendQueue(Math.Max(maxCapacity, m_MaxPayloadSize));
m_SendQueue.Add(sendTarget, queue);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,16 @@ public static IEnumerator EnsureNoNetworkEvent(List<TransportEvent> events, floa
}

// Common code to initialize a UnityTransport that logs its events.
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, int disconnectTimeout = NetworkParameterConstants.DisconnectTimeoutMS)
{
InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family);
InitializeTransport(out transport, out events, string.Empty, maxPayloadSize, maxSendQueueSize, family, disconnectTimeout);
}

/// <summary>
/// Interanl version with identifier parameter
/// Internal version with identifier parameter
/// </summary>
internal static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, string identifier,
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, int disconnectTimeout = NetworkParameterConstants.DisconnectTimeoutMS)
{
var logger = new TransportEventLogger()
{
Expand All @@ -118,6 +118,7 @@ internal static void InitializeTransport(out UnityTransport transport, out List<
transport.OnTransportEvent += logger.HandleEvent;
transport.MaxPayloadSize = maxPayloadSize;
transport.MaxSendQueueSize = maxSendQueueSize;
transport.DisconnectTimeoutMS = disconnectTimeout;

if (family == NetworkFamily.Ipv6)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,34 @@ public IEnumerator SendMaximumPayloadSize(
yield return null;
}

[UnityTest]
public IEnumerator VeryLargeDisconnectTimeout()
{
// We want something that's over the old limit of ~44KB for reliable payloads.
var payloadSize = 64 * 1024;

var disconnectTimeout = int.MaxValue;

InitializeTransport(out m_Server, out m_ServerEvents, payloadSize, disconnectTimeout: disconnectTimeout);
InitializeTransport(out m_Client1, out m_Client1Events, payloadSize, disconnectTimeout: disconnectTimeout);
Assert.That(m_Server.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));
Assert.That(m_Client1.DisconnectTimeoutMS, Is.EqualTo(disconnectTimeout));

m_Server.StartServer();
m_Client1.StartClient();

yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);

var payload = new ArraySegment<byte>(Encoding.ASCII.GetBytes("Some message"));
m_Client1.Send(m_Client1.ServerClientId, payload, NetworkDelivery.Reliable);

yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents, MaxNetworkEventWaitTime * 4);

Assert.That(m_ServerEvents[1].Data, Is.EquivalentTo(Encoding.ASCII.GetBytes("Some message")));

yield return null;
}

// Check making multiple sends to a client in a single frame.
[UnityTest]
public IEnumerator MultipleSendsSingleFrame(
Expand Down