Switched the Generic MLAPI message layer to BitWriter & BitReader

This commit is contained in:
Albin Corén 2018-04-17 21:38:08 +02:00
parent 85ecca2af9
commit 4d28f3420e
2 changed files with 305 additions and 348 deletions

View File

@ -10,6 +10,7 @@ using System.Security.Cryptography;
using MLAPI.NetworkingManagerComponents.Cryptography;
using MLAPI.NetworkingManagerComponents.Core;
using UnityEngine.SceneManagement;
using MLAPI.NetworkingManagerComponents.Binary;
namespace MLAPI.MonoBehaviours.Core
{
@ -821,28 +822,26 @@ namespace MLAPI.MonoBehaviours.Core
private void HandleIncomingData(uint clientId, byte[] data, int channelId)
{
using(MemoryStream readStream = new MemoryStream(data))
{
using (BinaryReader reader = new BinaryReader(readStream))
{
ushort messageType = reader.ReadUInt16();
bool targeted = reader.ReadBoolean();
BitReader reader = new BitReader(data);
ushort messageType = reader.ReadUShort();
bool targeted = reader.ReadBool();
uint targetNetworkId = 0;
ushort networkOrderId = 0;
if (targeted)
{
targetNetworkId = reader.ReadUInt32();
networkOrderId = reader.ReadUInt16();
targetNetworkId = reader.ReadUInt();
networkOrderId = reader.ReadUShort();
}
bool isPassthrough = reader.ReadBoolean();
bool isPassthrough = reader.ReadBool();
uint passthroughOrigin = 0;
uint passthroughTarget = 0;
if (isPassthrough && isServer)
passthroughTarget = reader.ReadUInt32();
passthroughTarget = reader.ReadUInt();
else if (isPassthrough && !isServer)
passthroughOrigin = reader.ReadUInt32();
passthroughOrigin = reader.ReadUInt();
//Client tried to send a network message that was not the connection request before he was accepted.
@ -853,8 +852,10 @@ namespace MLAPI.MonoBehaviours.Core
}
ushort bytesToRead = reader.ReadUInt16();
byte[] incommingData = reader.ReadBytes(bytesToRead);
//ushort bytesToRead = reader.ReadUShort();
reader.SkipPadded();
byte[] incommingData = reader.ReadByteArray();
if (NetworkConfig.EncryptedChannelsHashSet.Contains(MessageManager.reverseChannels[channelId]))
{
//Encrypted message
@ -1015,8 +1016,6 @@ namespace MLAPI.MonoBehaviours.Core
#endregion
}
}
}
}
internal void DisconnectClient(uint clientId)
{

View File

@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.IO;
using System;
using System.Collections.Generic;
using MLAPI.Data;
using MLAPI.MonoBehaviours.Core;
using MLAPI.NetworkingManagerComponents.Binary;
using MLAPI.NetworkingManagerComponents.Cryptography;
using UnityEngine;
using UnityEngine.Networking;
@ -20,41 +20,29 @@ namespace MLAPI.NetworkingManagerComponents.Core
return;
}
int sizeOfStream = 10;
if (networkId != null)
sizeOfStream += 4;
if (orderId != null)
sizeOfStream += 2;
sizeOfStream += data.Length;
using (BitWriter writer = new BitWriter())
{
writer.WriteUShort(messageType);
writer.WriteBool(networkId != null);
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(messageType);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.WriteUInt(networkId.Value);
if (orderId != null)
writer.Write(orderId.Value);
writer.Write(true);
writer.Write(sourceId);
writer.WriteUShort(orderId.Value);
writer.WriteBool(true);
writer.WriteUInt(sourceId);
writer.WriteAlignBits();
if (netManager.NetworkConfig.EncryptedChannelsHashSet.Contains(MessageManager.reverseChannels[channelId]))
{
//Encrypted message
byte[] encrypted = CryptographyHelper.Encrypt(data, netManager.connectedClients[targetId].AesKey);
writer.Write((ushort)encrypted.Length);
writer.Write(encrypted);
}
writer.WriteByteArray(CryptographyHelper.Encrypt(data, netManager.connectedClients[targetId].AesKey));
else
{
writer.Write((ushort)data.Length);
writer.Write(data);
}
}
writer.WriteByteArray(data);
byte error;
NetworkTransport.QueueMessageForSending(targetNetId.HostId, targetNetId.ConnectionId, channelId, stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.QueueMessageForSending(targetNetId.HostId, targetNetId.ConnectionId, channelId, writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
}
}
@ -80,28 +68,23 @@ namespace MLAPI.NetworkingManagerComponents.Core
return;
}
int sizeOfStream = 6;
if (networkId != null)
sizeOfStream += 4;
if (orderId != null)
sizeOfStream += 2;
if (isPassthrough)
sizeOfStream += 4;
sizeOfStream += data.Length;
using (BitWriter writer = new BitWriter())
{
writer.WriteUShort(MessageManager.messageTypes[messageType]);
writer.WriteBool(networkId != null);
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.WriteUInt(networkId.Value);
if (orderId != null)
writer.Write(orderId.Value);
writer.Write(isPassthrough);
writer.WriteUShort(orderId.Value);
writer.WriteBool(isPassthrough);
if (isPassthrough)
writer.Write(clientId);
writer.WriteUInt(clientId);
writer.WriteAlignBits();
if (netManager.NetworkConfig.EncryptedChannelsHashSet.Contains(channelName))
{
@ -112,23 +95,18 @@ namespace MLAPI.NetworkingManagerComponents.Core
else
encrypted = CryptographyHelper.Encrypt(data, netManager.clientAesKey);
writer.Write((ushort)encrypted.Length);
writer.Write(encrypted);
writer.WriteByteArray(encrypted);
}
else
{
//Send in plaintext.
writer.Write((ushort)data.Length);
writer.Write(data);
}
}
writer.WriteByteArray(data);
byte error;
if (isPassthrough)
netId = NetId.ServerNetId;
if (skipQueue)
NetworkTransport.Send(netId.HostId, netId.ConnectionId, MessageManager.channels[channelName], stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.Send(netId.HostId, netId.ConnectionId, MessageManager.channels[channelName], writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
else
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, MessageManager.channels[channelName], stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, MessageManager.channels[channelName], writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
}
}
@ -140,27 +118,23 @@ namespace MLAPI.NetworkingManagerComponents.Core
return;
}
int sizeOfStream = 6;
if (networkId != null)
sizeOfStream += 4;
if (orderId != null)
sizeOfStream += 2;
sizeOfStream += data.Length;
using (BitWriter writer = new BitWriter())
{
writer.WriteUShort(MessageManager.messageTypes[messageType]);
writer.WriteBool(networkId != null);
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.WriteUInt(networkId.Value);
if (orderId != null)
writer.Write(orderId.Value);
writer.Write(false);
writer.Write((ushort)data.Length);
writer.Write(data);
}
writer.WriteUShort(orderId.Value);
writer.WriteBool(false);
writer.WriteAlignBits();
writer.WriteByteArray(data);
int channel = MessageManager.channels[channelName];
for (int i = 0; i < clientIds.Length; i++)
{
@ -176,7 +150,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
netId = NetId.ServerNetId;
}
byte error;
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
}
}
}
@ -189,28 +163,23 @@ namespace MLAPI.NetworkingManagerComponents.Core
return;
}
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 6;
if (networkId != null)
sizeOfStream += 4;
if (orderId != null)
sizeOfStream += 2;
sizeOfStream += data.Length;
using (BitWriter writer = new BitWriter())
{
writer.WriteUShort(MessageManager.messageTypes[messageType]);
writer.WriteBool(networkId != null);
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.WriteUInt(networkId.Value);
if (orderId != null)
writer.Write(orderId.Value);
writer.Write(false);
writer.Write((ushort)data.Length);
writer.Write(data);
}
writer.WriteUShort(orderId.Value);
writer.WriteBool(false);
writer.WriteAlignBits();
writer.WriteByteArray(data);
int channel = MessageManager.channels[channelName];
for (int i = 0; i < clientIds.Count; i++)
{
@ -226,7 +195,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
netId = NetId.ServerNetId;
}
byte error;
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
}
}
}
@ -240,29 +209,23 @@ namespace MLAPI.NetworkingManagerComponents.Core
Debug.LogWarning("MLAPI: Cannot send messages over encrypted channel to multiple clients.");
return;
}
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 6;
if (networkId != null)
sizeOfStream += 4;
if (orderId != null)
sizeOfStream += 2;
sizeOfStream += data.Length;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
using (BitWriter writer = new BitWriter())
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
writer.WriteUShort(MessageManager.messageTypes[messageType]);
writer.WriteBool(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.WriteUInt(networkId.Value);
if (orderId != null)
writer.Write(orderId.Value);
writer.Write(false);
writer.Write((ushort)data.Length);
writer.Write(data);
}
writer.WriteUShort(orderId.Value);
writer.WriteBool(false);
writer.WriteAlignBits();
writer.WriteByteArray(data);
int channel = MessageManager.channels[channelName];
foreach (KeyValuePair<uint, NetworkedClient> pair in netManager.connectedClients)
{
@ -278,7 +241,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
netId = NetId.ServerNetId;
}
byte error;
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
}
}
}
@ -291,28 +254,23 @@ namespace MLAPI.NetworkingManagerComponents.Core
return;
}
//2 bytes for messageType, 2 bytes for buffer length and one byte for target bool
int sizeOfStream = 5;
if (networkId != null)
sizeOfStream += 4;
if (orderId != null)
sizeOfStream += 2;
sizeOfStream += data.Length;
using (BitWriter writer = new BitWriter())
{
writer.WriteUShort(MessageManager.messageTypes[messageType]);
writer.WriteBool(networkId != null);
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(MessageManager.messageTypes[messageType]);
writer.Write(networkId != null);
if (networkId != null)
writer.Write(networkId.Value);
writer.WriteUInt(networkId.Value);
if (orderId != null)
writer.Write(orderId.Value);
writer.Write(false);
writer.Write((ushort)data.Length);
writer.Write(data);
}
writer.WriteUShort(orderId.Value);
writer.WriteBool(false);
writer.WriteAlignBits();
writer.WriteByteArray(data);
int channel = MessageManager.channels[channelName];
foreach (KeyValuePair<uint, NetworkedClient> pair in netManager.connectedClients)
{
@ -331,7 +289,7 @@ namespace MLAPI.NetworkingManagerComponents.Core
netId = NetId.ServerNetId;
}
byte error;
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, stream.GetBuffer(), sizeOfStream, out error);
NetworkTransport.QueueMessageForSending(netId.HostId, netId.ConnectionId, channel, writer.Finalize(), (int)writer.GetFinalizeSize(), out error);
}
}
}