public override void Receive(byte[] data, int startIndex, int length) { //UnityEngine.Debug.LogError("Receive: " + GetType().ToString() + ": " + DeBox.Teleport.Debugging.TeleportDebugUtils.DebugString(data, startIndex, length)); var expectedDataSize = BitConverter.ToUInt16(data, startIndex); startIndex += sizeof(ushort); length = length - sizeof(ushort); var receivedDataSize = length; if (_receiveLeftoversLength > 0) { Array.Copy(data, startIndex, _receiveLeftovers, _receiveLeftoversLength, receivedDataSize); data = _receiveLeftovers; _receiveLeftoversLength = _receiveLeftoversLength + receivedDataSize; receivedDataSize = _receiveLeftoversLength; UnityEngine.Debug.LogError("Had leftovers"); startIndex = 0; length = _receiveLeftoversLength; } if (expectedDataSize > receivedDataSize) { Array.Copy(data, startIndex, _receiveLeftovers, 0, receivedDataSize); _receiveLeftoversLength = receivedDataSize; UnityEngine.Debug.LogError("Not enough data! expected: " + expectedDataSize + " got: " + receivedDataSize); return; } else if (expectedDataSize < receivedDataSize) { _receiveLeftoversLength = receivedDataSize - expectedDataSize; Array.Copy(data, startIndex + expectedDataSize, _receiveLeftovers, 0, _receiveLeftoversLength); length = expectedDataSize; } InternalChannel.Receive(data, startIndex, length); }
private void ProcessInbox() { if (_inbox.Count == 0) { return; } InboxItem inboxItem; ushort nextIndex; while (_lastReceiveIndex > _lastProcessedReceiveIndex) { nextIndex = (ushort)(_lastProcessedReceiveIndex + 1); if (!_inbox.TryGetValue(nextIndex, out inboxItem)) { break; } InternalChannel.Receive(inboxItem.data, inboxItem.startIndex, inboxItem.length); _lastProcessedReceiveIndex = nextIndex; } }