Skip to content

Commit 3ee1b1c

Browse files
authored
Merge pull request #165 from angusmf/master
Fix for issue #164
2 parents 83ddcc6 + 2179b41 commit 3ee1b1c

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

MLAPI/Data/Transports/UNET/UnetTransport.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace MLAPI.Transports.UNET
88
[Serializable]
99
public class UnetTransport : IUDPTransport
1010
{
11+
private WeakReference temporaryBufferReference;
12+
1113
public ChannelType InternalChannel => ChannelType.ReliableFragmentedSequenced;
1214
public uint ServerClientId => new NetId(0, 0, true).GetClientId();
1315
public int serverConnectionId;
@@ -68,6 +70,27 @@ public NetEventType PollReceive(out uint clientId, out int channelId, ref byte[]
6870
NetworkEventType eventType = NetworkTransport.Receive(out int hostId, out int connectionId, out channelId, data, bufferSize, out receivedSize, out byte err);
6971
clientId = new NetId((byte)hostId, (ushort)connectionId, false).GetClientId();
7072
NetworkError errorType = (NetworkError)err;
73+
74+
if (errorType == NetworkError.MessageToLong)
75+
{
76+
byte[] tempBuffer;
77+
if (temporaryBufferReference != null && temporaryBufferReference.IsAlive && ((byte[]) temporaryBufferReference.Target).Length >= receivedSize)
78+
{
79+
tempBuffer = (byte[])temporaryBufferReference.Target;
80+
}
81+
else
82+
{
83+
tempBuffer = new byte[receivedSize];
84+
temporaryBufferReference = new WeakReference(tempBuffer);
85+
}
86+
87+
eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, tempBuffer, tempBuffer.Length, out receivedSize, out err);
88+
data = tempBuffer;
89+
}
90+
errorType = (NetworkError)err;
91+
clientId = new NetId((byte)hostId, (ushort)connectionId, false).GetClientId();
92+
93+
7194
if (errorType == NetworkError.Timeout)
7295
eventType = NetworkEventType.DisconnectEvent; //In UNET. Timeouts are not disconnects. We have to translate that here.
7396
error = 0;

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using MLAPI.Transports.UNET;
2121
using BitStream = MLAPI.Serialization.BitStream;
2222
using System.Security.Cryptography.X509Certificates;
23+
using UnityEngine.Networking;
2324

2425
namespace MLAPI
2526
{
@@ -644,13 +645,13 @@ private void Update()
644645
do
645646
{
646647
processedEvents++;
647-
uint clientId;
648-
int channelId;
649-
int receivedSize;
650-
byte error;
651-
byte[] data = messageBuffer;
652-
eventType = NetworkConfig.NetworkTransport.PollReceive(out clientId, out channelId, ref data, data.Length, out receivedSize, out error);
648+
eventType = NetworkConfig.NetworkTransport.PollReceive(out uint clientId, out int channelId, ref messageBuffer, messageBuffer.Length, out int receivedSize, out byte error);
653649

650+
if ((NetworkError)error == NetworkError.MessageToLong)
651+
{
652+
byte[] b = messageBuffer;
653+
eventType = NetworkConfig.NetworkTransport.PollReceive(out clientId, out channelId, ref b, b.Length, out receivedSize, out error);
654+
}
654655
switch (eventType)
655656
{
656657
case NetEventType.Connect:
@@ -731,7 +732,7 @@ private void Update()
731732
case NetEventType.Data:
732733
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo($"Incoming Data From {clientId} : {receivedSize} bytes");
733734

734-
HandleIncomingData(clientId, data, channelId, receivedSize);
735+
HandleIncomingData(clientId, messageBuffer, channelId, receivedSize);
735736
break;
736737
case NetEventType.Disconnect:
737738
NetworkProfiler.StartEvent(TickType.Receive, 0, "NONE", "TRANSPORT_DISCONNECT");

0 commit comments

Comments
 (0)