Skip to content

Commit bf676fe

Browse files
authored
fix: Server was able to be mapped as both ID 0 and ID 1 (#1683)
1 parent 691949b commit bf676fe

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ Additional documentation and release notes are available at [Multiplayer Documen
1414

1515
### Fixed
1616

17+
- Fixed an issue where sometimes the first client to connect to the server could see messages from the server as coming from itself. (#1683)
18+
- Fixed an issue where clients seemed to be able to send messages to ClientId 1, but these messages would actually still go to the server (id 0) instead of that client. (#1683)
19+
- Improved clarity of error messaging when a client attempts to send a message to a destination other than the server, which isn't allowed. (#1683)
1720
- Disallowed async keyword in RPCs (#1681)
1821
- Fixed an issue where Alpha release versions of Unity (version 20202.2.0a5 and later) will not compile due to the UNet Transport no longer existing (#1678)
1922
- Fixed messages larger than 64k being written with incorrectly truncated message size in header (#1686) (credit: @kaen)

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,20 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, A
13541354
s_TransportConnect.Begin();
13551355
#endif
13561356

1357-
clientId = m_NextClientId++;
1357+
// Assumptions:
1358+
// - When server receives a connection, it *must be* a client
1359+
// - When client receives one, it *must be* the server
1360+
// Client's can't connect to or talk to other clients.
1361+
// Server is a sentinel so only one exists, if we are server, we can't be
1362+
// connecting to it.
1363+
if (IsServer)
1364+
{
1365+
clientId = m_NextClientId++;
1366+
}
1367+
else
1368+
{
1369+
clientId = ServerClientId;
1370+
}
13581371
m_ClientIdToTransportIdMap[clientId] = transportId;
13591372
m_TransportIdToClientIdMap[transportId] = clientId;
13601373

@@ -1457,6 +1470,12 @@ internal unsafe int SendMessage<TMessageType, TClientIdListType>(ref TMessageTyp
14571470
}
14581471
return MessagingSystem.SendMessage(ref message, delivery, nonServerIds, newIdx);
14591472
}
1473+
// else
1474+
if (clientIds.Count != 1 || clientIds[0] != ServerClientId)
1475+
{
1476+
throw new ArgumentException($"Clients may only send messages to {nameof(ServerClientId)}");
1477+
}
1478+
14601479
return MessagingSystem.SendMessage(ref message, delivery, clientIds);
14611480
}
14621481

@@ -1485,6 +1504,11 @@ internal unsafe int SendMessage<T>(ref T message, NetworkDelivery delivery,
14851504
}
14861505
return MessagingSystem.SendMessage(ref message, delivery, nonServerIds, newIdx);
14871506
}
1507+
// else
1508+
if (numClientIds != 1 || clientIds[0] != ServerClientId)
1509+
{
1510+
throw new ArgumentException($"Clients may only send messages to {nameof(ServerClientId)}");
1511+
}
14881512

14891513
return MessagingSystem.SendMessage(ref message, delivery, clientIds, numClientIds);
14901514
}
@@ -1503,6 +1527,11 @@ internal int SendMessage<T>(ref T message, NetworkDelivery delivery, ulong clien
15031527
{
15041528
return 0;
15051529
}
1530+
1531+
if (!IsServer && clientId != ServerClientId)
1532+
{
1533+
throw new ArgumentException($"Clients may only send messages to {nameof(ServerClientId)}");
1534+
}
15061535
return MessagingSystem.SendMessage(ref message, delivery, clientId);
15071536
}
15081537

com.unity.netcode.gameobjects/Runtime/Messaging/MessagingSystem.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public unsafe void Dispose()
118118
for (var queueIndex = 0; queueIndex < m_IncomingMessageQueue.Length; ++queueIndex)
119119
{
120120
// Avoid copies...
121-
ref var item = ref m_IncomingMessageQueue.GetUnsafeList()->ElementAt(queueIndex);
121+
ref var item = ref m_IncomingMessageQueue.ElementAt(queueIndex);
122122
item.Reader.Dispose();
123123
}
124124

@@ -279,7 +279,7 @@ internal unsafe void ProcessIncomingMessageQueue()
279279
for (var index = 0; index < m_IncomingMessageQueue.Length; ++index)
280280
{
281281
// Avoid copies...
282-
ref var item = ref m_IncomingMessageQueue.GetUnsafeList()->ElementAt(index);
282+
ref var item = ref m_IncomingMessageQueue.ElementAt(index);
283283
HandleMessage(item.Header, item.Reader, item.SenderId, item.Timestamp, item.MessageHeaderSerializedSize);
284284
if (m_Disposed)
285285
{
@@ -314,7 +314,7 @@ private unsafe void CleanupDisconnectedClient(ulong clientId)
314314
var queue = m_SendQueues[clientId];
315315
for (var i = 0; i < queue.Length; ++i)
316316
{
317-
queue.GetUnsafeList()->ElementAt(i).Writer.Dispose();
317+
queue.ElementAt(i).Writer.Dispose();
318318
}
319319

320320
queue.Dispose();
@@ -402,22 +402,22 @@ internal unsafe int SendPreSerializedMessage<TMessageType>(in FastBufferWriter t
402402
{
403403
sendQueueItem.Add(new SendQueueItem(delivery, NON_FRAGMENTED_MESSAGE_MAX_SIZE, Allocator.TempJob,
404404
maxSize));
405-
sendQueueItem.GetUnsafeList()->ElementAt(0).Writer.Seek(sizeof(BatchHeader));
405+
sendQueueItem.ElementAt(0).Writer.Seek(sizeof(BatchHeader));
406406
}
407407
else
408408
{
409-
ref var lastQueueItem = ref sendQueueItem.GetUnsafeList()->ElementAt(sendQueueItem.Length - 1);
409+
ref var lastQueueItem = ref sendQueueItem.ElementAt(sendQueueItem.Length - 1);
410410
if (lastQueueItem.NetworkDelivery != delivery ||
411411
lastQueueItem.Writer.MaxCapacity - lastQueueItem.Writer.Position
412412
< tmpSerializer.Length + headerSerializer.Length)
413413
{
414414
sendQueueItem.Add(new SendQueueItem(delivery, NON_FRAGMENTED_MESSAGE_MAX_SIZE, Allocator.TempJob,
415415
maxSize));
416-
sendQueueItem.GetUnsafeList()->ElementAt(sendQueueItem.Length - 1).Writer.Seek(sizeof(BatchHeader));
416+
sendQueueItem.ElementAt(sendQueueItem.Length - 1).Writer.Seek(sizeof(BatchHeader));
417417
}
418418
}
419419

420-
ref var writeQueueItem = ref sendQueueItem.GetUnsafeList()->ElementAt(sendQueueItem.Length - 1);
420+
ref var writeQueueItem = ref sendQueueItem.ElementAt(sendQueueItem.Length - 1);
421421
writeQueueItem.Writer.TryBeginWrite(tmpSerializer.Length + headerSerializer.Length);
422422

423423
writeQueueItem.Writer.WriteBytes(headerSerializer.GetUnsafePtr(), headerSerializer.Length);
@@ -502,7 +502,7 @@ internal unsafe void ProcessSendQueues()
502502
var sendQueueItem = kvp.Value;
503503
for (var i = 0; i < sendQueueItem.Length; ++i)
504504
{
505-
ref var queueItem = ref sendQueueItem.GetUnsafeList()->ElementAt(i);
505+
ref var queueItem = ref sendQueueItem.ElementAt(i);
506506
if (queueItem.BatchHeader.BatchSize == 0)
507507
{
508508
queueItem.Writer.Dispose();

0 commit comments

Comments
 (0)