Skip to content

Commit ddaeaf3

Browse files
committed
feat: Added tasked Socket API
BREAKING CHANGE: Changes the Transport base class, removes server SendTick Fixes: #263
1 parent f9275d7 commit ddaeaf3

File tree

9 files changed

+267
-108
lines changed

9 files changed

+267
-108
lines changed

MLAPI-Editor/NetworkingManagerEditor.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public class NetworkingManagerEditor : Editor
2626
private SerializedProperty networkTransportProperty;
2727
private SerializedProperty receiveTickrateProperty;
2828
private SerializedProperty maxReceiveEventsPerTickRateProperty;
29-
private SerializedProperty sendTickrateProperty;
3029
private SerializedProperty eventTickrateProperty;
3130
private SerializedProperty maxObjectUpdatesPerTickProperty;
3231
private SerializedProperty clientConnectionBufferTimeoutProperty;
@@ -105,7 +104,6 @@ private void Init()
105104
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
106105
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
107106
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
108-
sendTickrateProperty = networkConfigProperty.FindPropertyRelative("SendTickrate");
109107
eventTickrateProperty = networkConfigProperty.FindPropertyRelative("EventTickrate");
110108
maxObjectUpdatesPerTickProperty = networkConfigProperty.FindPropertyRelative("MaxObjectUpdatesPerTick");
111109
clientConnectionBufferTimeoutProperty = networkConfigProperty.FindPropertyRelative("ClientConnectionBufferTimeout");
@@ -144,7 +142,6 @@ private void CheckNullProperties()
144142
networkTransportProperty = networkConfigProperty.FindPropertyRelative("NetworkTransport");
145143
receiveTickrateProperty = networkConfigProperty.FindPropertyRelative("ReceiveTickrate");
146144
maxReceiveEventsPerTickRateProperty = networkConfigProperty.FindPropertyRelative("MaxReceiveEventsPerTickRate");
147-
sendTickrateProperty = networkConfigProperty.FindPropertyRelative("SendTickrate");
148145
eventTickrateProperty = networkConfigProperty.FindPropertyRelative("EventTickrate");
149146
maxObjectUpdatesPerTickProperty = networkConfigProperty.FindPropertyRelative("MaxObjectUpdatesPerTick");
150147
clientConnectionBufferTimeoutProperty = networkConfigProperty.FindPropertyRelative("ClientConnectionBufferTimeout");
@@ -295,7 +292,6 @@ public override void OnInspectorGUI()
295292
EditorGUILayout.LabelField("Performance", EditorStyles.boldLabel);
296293
EditorGUILayout.PropertyField(receiveTickrateProperty);
297294
EditorGUILayout.PropertyField(maxReceiveEventsPerTickRateProperty);
298-
EditorGUILayout.PropertyField(sendTickrateProperty);
299295
EditorGUILayout.PropertyField(eventTickrateProperty);
300296
EditorGUILayout.PropertyField(enableNetworkedVarProperty);
301297

MLAPI/Configuration/NetworkConfig.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,9 @@ public class NetworkConfig
6565
[Tooltip("The maximum amount of Receive events to poll per Receive tick. This is to prevent flooding and freezing on the server")]
6666
public int MaxReceiveEventsPerTickRate = 500;
6767
/// <summary>
68-
/// The amount of times per second every pending message will be sent away.
69-
/// </summary>
70-
[Tooltip("The amount of times per second the pending messages are sent")]
71-
public int SendTickrate = 64;
72-
/// <summary>
7368
/// The amount of times per second internal frame events will occur, examples include SyncedVar send checking.
7469
/// </summary>
75-
[Tooltip("The amount of times per second the internal event loop will run. This includes for example SyncedVar checking and LagCompensation tracking")]
70+
[Tooltip("The amount of times per second the internal event loop will run. This includes for example NetworkedVar checking and LagCompensation tracking")]
7671
public int EventTickrate = 64;
7772
/// <summary>
7873
/// The maximum amount of NetworkedObject's to process per tick.
@@ -229,7 +224,6 @@ public string ToBase64()
229224

230225
writer.WriteInt32Packed(config.ReceiveTickrate);
231226
writer.WriteInt32Packed(config.MaxReceiveEventsPerTickRate);
232-
writer.WriteInt32Packed(config.SendTickrate);
233227
writer.WriteInt32Packed(config.EventTickrate);
234228
writer.WriteInt32Packed(config.ClientConnectionBufferTimeout);
235229
writer.WriteBool(config.ConnectionApproval);
@@ -277,7 +271,6 @@ public void FromBase64(string base64)
277271

278272
config.ReceiveTickrate = reader.ReadInt32Packed();
279273
config.MaxReceiveEventsPerTickRate = reader.ReadInt32Packed();
280-
config.SendTickrate = reader.ReadInt32Packed();
281274
config.EventTickrate = reader.ReadInt32Packed();
282275
config.ClientConnectionBufferTimeout = reader.ReadInt32Packed();
283276
config.ConnectionApproval = reader.ReadBool();

MLAPI/Core/NetworkingManager.cs

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using MLAPI.Spawning;
2525
using static MLAPI.Messaging.CustomMessagingManager;
2626
using MLAPI.Exceptions;
27+
using MLAPI.Transports.Tasks;
2728

2829
namespace MLAPI
2930
{
@@ -319,7 +320,6 @@ private void Init(bool server)
319320
networkTimeOffset = 0f;
320321
currentNetworkTimeOffset = 0f;
321322
networkTimeInitialized = false;
322-
lastSendTickTime = 0f;
323323
lastEventTickTime = 0f;
324324
lastReceiveTickTime = 0f;
325325
eventOvershootCounter = 0f;
@@ -395,13 +395,13 @@ private void Init(bool server)
395395
/// <summary>
396396
/// Starts a server
397397
/// </summary>
398-
public void StartServer()
398+
public SocketTasks StartServer()
399399
{
400400
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("StartServer()");
401401
if (IsServer || IsClient)
402402
{
403403
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Cannot start server while an instance is already running");
404-
return;
404+
return SocketTask.Fault.AsTasks();
405405
}
406406

407407
if (NetworkConfig.ConnectionApproval)
@@ -413,7 +413,8 @@ public void StartServer()
413413
}
414414

415415
Init(true);
416-
NetworkConfig.NetworkTransport.StartServer();
416+
417+
SocketTasks tasks = NetworkConfig.NetworkTransport.StartServer();
417418

418419
IsServer = true;
419420
IsClient = false;
@@ -423,26 +424,32 @@ public void StartServer()
423424

424425
if (OnServerStarted != null)
425426
OnServerStarted.Invoke();
427+
428+
return tasks;
426429
}
427430

428431
/// <summary>
429432
/// Starts a client
430433
/// </summary>
431-
public void StartClient()
434+
public SocketTasks StartClient()
432435
{
433436
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("StartClient()");
437+
434438
if (IsServer || IsClient)
435439
{
436440
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Cannot start client while an instance is already running");
437-
return;
441+
return SocketTask.Fault.AsTasks();
438442
}
439443

440444
Init(false);
441-
NetworkConfig.NetworkTransport.StartClient();
445+
446+
SocketTasks tasks = NetworkConfig.NetworkTransport.StartClient();
442447

443448
IsServer = false;
444449
IsClient = true;
445450
IsListening = true;
451+
452+
return tasks;
446453
}
447454

448455
/// <summary>
@@ -510,13 +517,14 @@ public void StopClient()
510517
/// <summary>
511518
/// Starts a Host
512519
/// </summary>
513-
public void StartHost(Vector3? position = null, Quaternion? rotation = null, bool? createPlayerObject = null, ulong? prefabHash = null, Stream payloadStream = null)
520+
public SocketTasks StartHost(Vector3? position = null, Quaternion? rotation = null, bool? createPlayerObject = null, ulong? prefabHash = null, Stream payloadStream = null)
514521
{
515522
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("StartHost()");
523+
516524
if (IsServer || IsClient)
517525
{
518526
if (LogHelper.CurrentLogLevel <= LogLevel.Normal) LogHelper.LogWarning("Cannot start host while an instance is already running");
519-
return;
527+
return SocketTask.Fault.AsTasks();
520528
}
521529

522530
if (NetworkConfig.ConnectionApproval)
@@ -528,7 +536,8 @@ public void StartHost(Vector3? position = null, Quaternion? rotation = null, boo
528536
}
529537

530538
Init(true);
531-
NetworkConfig.NetworkTransport.StartServer();
539+
540+
SocketTasks tasks = NetworkConfig.NetworkTransport.StartServer();
532541

533542
IsServer = true;
534543
IsClient = true;
@@ -558,6 +567,8 @@ public void StartHost(Vector3? position = null, Quaternion? rotation = null, boo
558567

559568
if (OnServerStarted != null)
560569
OnServerStarted.Invoke();
570+
571+
return tasks;
561572
}
562573

563574
private void OnEnable()
@@ -601,28 +612,13 @@ private void Shutdown()
601612
}
602613

603614
private float lastReceiveTickTime;
604-
private float lastSendTickTime;
605615
private float lastEventTickTime;
606616
private float eventOvershootCounter;
607617
private float lastTimeSyncTime;
608618
private void Update()
609619
{
610620
if(IsListening)
611621
{
612-
if ((NetworkTime - lastSendTickTime >= (1f / NetworkConfig.SendTickrate)) || NetworkConfig.SendTickrate <= 0)
613-
{
614-
if (NetworkConfig.EnableNetworkedVar)
615-
{
616-
NetworkedObject.NetworkedBehaviourUpdate();
617-
}
618-
619-
foreach (KeyValuePair<ulong, NetworkedClient> pair in ConnectedClients)
620-
{
621-
NetworkConfig.NetworkTransport.FlushSendQueue(pair.Key);
622-
}
623-
624-
lastSendTickTime = NetworkTime;
625-
}
626622
if ((NetworkTime - lastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
627623
{
628624
NetworkProfiler.StartTick(TickType.Receive);
@@ -701,7 +697,7 @@ private void Update()
701697
}
702698
}
703699
// Send the hail
704-
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_CERTIFICATE_HAIL, "MLAPI_INTERNAL", hailStream, SecuritySendFlags.None, null, true);
700+
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_CERTIFICATE_HAIL, "MLAPI_INTERNAL", hailStream, SecuritySendFlags.None, null);
705701
}
706702
}
707703
else
@@ -759,6 +755,13 @@ private void Update()
759755
eventOvershootCounter += ((NetworkTime - lastEventTickTime) - (1f / NetworkConfig.EventTickrate));
760756
LagCompensationManager.AddFrames();
761757
ResponseMessageManager.CheckTimeouts();
758+
759+
if (NetworkConfig.EnableNetworkedVar)
760+
{
761+
// Do NetworkedVar updates
762+
NetworkedObject.NetworkedBehaviourUpdate();
763+
}
764+
762765
lastEventTickTime = NetworkTime;
763766
NetworkProfiler.EndTick();
764767
}
@@ -813,7 +816,7 @@ internal void SendConnectionRequest()
813816
writer.WriteByteArray(NetworkConfig.ConnectionData);
814817
}
815818

816-
InternalMessageSender.Send(ServerClientId, MLAPIConstants.MLAPI_CONNECTION_REQUEST, "MLAPI_INTERNAL", stream, SecuritySendFlags.Authenticated | SecuritySendFlags.Encrypted, null, true);
819+
InternalMessageSender.Send(ServerClientId, MLAPIConstants.MLAPI_CONNECTION_REQUEST, "MLAPI_INTERNAL", stream, SecuritySendFlags.Authenticated | SecuritySendFlags.Encrypted, null);
817820
}
818821
}
819822

@@ -1063,7 +1066,7 @@ private void SyncTime()
10631066
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
10641067
{
10651068
writer.WriteSinglePacked(Time.realtimeSinceStartup);
1066-
InternalMessageSender.Send(MLAPIConstants.MLAPI_TIME_SYNC, "MLAPI_TIME_SYNC", stream, SecuritySendFlags.None, null, true);
1069+
InternalMessageSender.Send(MLAPIConstants.MLAPI_TIME_SYNC, "MLAPI_TIME_SYNC", stream, SecuritySendFlags.None, null);
10671070
}
10681071
}
10691072
}
@@ -1190,7 +1193,7 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
11901193
}
11911194
}
11921195

1193-
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_CONNECTION_APPROVED, "MLAPI_INTERNAL", stream, SecuritySendFlags.Encrypted | SecuritySendFlags.Authenticated, null, true);
1196+
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_CONNECTION_APPROVED, "MLAPI_INTERNAL", stream, SecuritySendFlags.Encrypted | SecuritySendFlags.Authenticated, null);
11941197

11951198
if (OnClientConnectedCallback != null)
11961199
OnClientConnectedCallback.Invoke(clientId);

MLAPI/Messaging/InternalMessageHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ internal static void HandleHailRequest(ulong clientId, Stream stream)
130130
}
131131

132132
// Send HailResponse
133-
InternalMessageSender.Send(NetworkingManager.Singleton.ServerClientId, MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE, "MLAPI_INTERNAL", outStream, SecuritySendFlags.None, null, true);
133+
InternalMessageSender.Send(NetworkingManager.Singleton.ServerClientId, MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE, "MLAPI_INTERNAL", outStream, SecuritySendFlags.None, null);
134134
}
135135
}
136136

@@ -160,7 +160,7 @@ internal static void HandleHailResponse(ulong clientId, Stream stream)
160160
writer.WriteInt64Packed(DateTime.Now.Ticks); // This serves no purpose.
161161
}
162162

163-
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_GREETINGS, "MLAPI_INTERNAL", outStream, SecuritySendFlags.None, null, true);
163+
InternalMessageSender.Send(clientId, MLAPIConstants.MLAPI_GREETINGS, "MLAPI_INTERNAL", outStream, SecuritySendFlags.None, null);
164164
}
165165
}
166166

MLAPI/Messaging/InternalMessageSender.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace MLAPI.Messaging
1010
{
1111
internal static class InternalMessageSender
1212
{
13-
internal static void Send(ulong clientId, byte messageType, string channelName, BitStream messageStream, SecuritySendFlags flags, NetworkedObject targetObject, bool skipQueue = false)
13+
internal static void Send(ulong clientId, byte messageType, string channelName, BitStream messageStream, SecuritySendFlags flags, NetworkedObject targetObject)
1414
{
1515
messageStream.PadStream();
1616

@@ -27,13 +27,13 @@ internal static void Send(ulong clientId, byte messageType, string channelName,
2727
{
2828
NetworkProfiler.StartEvent(TickType.Send, (uint)stream.Length, channelName, MLAPIConstants.MESSAGE_NAMES[messageType]);
2929

30-
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(clientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName, skipQueue);
30+
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(clientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName);
3131

3232
NetworkProfiler.EndEvent();
3333
}
3434
}
3535

36-
internal static void Send(byte messageType, string channelName, BitStream messageStream, SecuritySendFlags flags, NetworkedObject targetObject, bool skipQueue = false)
36+
internal static void Send(byte messageType, string channelName, BitStream messageStream, SecuritySendFlags flags, NetworkedObject targetObject)
3737
{
3838
bool encrypted = ((flags & SecuritySendFlags.Encrypted) == SecuritySendFlags.Encrypted) && NetworkingManager.Singleton.NetworkConfig.EnableEncryption;
3939
bool authenticated = ((flags & SecuritySendFlags.Authenticated) == SecuritySendFlags.Authenticated) && NetworkingManager.Singleton.NetworkConfig.EnableEncryption;
@@ -63,7 +63,7 @@ internal static void Send(byte messageType, string channelName, BitStream messag
6363
continue;
6464
}
6565

66-
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName, skipQueue);
66+
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName);
6767
}
6868
NetworkProfiler.EndEvent();
6969
}
@@ -104,7 +104,7 @@ internal static void Send(byte messageType, string channelName, ulong clientIdTo
104104
continue;
105105
}
106106

107-
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName, false);
107+
NetworkingManager.Singleton.NetworkConfig.NetworkTransport.Send(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ArraySegment<byte>(stream.GetBuffer(), 0, (int)stream.Length), channelName);
108108
}
109109
NetworkProfiler.EndEvent();
110110
}

0 commit comments

Comments
 (0)