private void ProcessReceiveBuffer(CentralContext context, byte[] value) { Utils.Info("received: {0} bytes remain {1} bytes {2}", value.Length, context.receiveBufferReader.BaseStream.Length, context.client.Session.DeviceId.Id); context.receiveBufferReader.BaseStream.Write(value, 0, value.Length - 1); if (context.receiveBufferReader.BaseStream.Length > BUFFER_SIZE) { Utils.Error("receive buffer overflow"); RemoveCentral(context); return; } context.receiveBufferReader.BaseStream.Seek(0, SeekOrigin.Begin); while (true) { if (context.receiveMessageSize == -1) { if (context.receiveBufferReader.BaseStream.Length - context.receiveBufferReader.BaseStream.Position < 2) { break; } context.receiveMessageSize = context.receiveBufferReader.ReadUInt16(); if (context.receiveMessageSize > MESSAGE_SIZE_MAX) { Utils.Error("invalid message size: {0}", context.receiveMessageSize); RemoveCentral(context); return; } } if (context.receiveMessageAddress == -1) { if (context.receiveBufferReader.BaseStream.Length - context.receiveBufferReader.BaseStream.Position < 2) { break; } context.receiveMessageAddress = context.receiveBufferReader.ReadUInt16(); } if (context.receiveBufferReader.BaseStream.Length - context.receiveBufferReader.BaseStream.Position < context.receiveMessageSize) { break; } var message = context.receiveBufferReader.ReadBytes(context.receiveMessageSize); int to = context.receiveMessageAddress; context.receiveMessageSize = -1; context.receiveMessageAddress = -1; if (context.playerId != 0) { int index = 0; while (index < mSubscribedCentrals.Count) { var ctx = mSubscribedCentrals[index]; if ((ctx.playerId & to) != 0) { if (!SendInternal(ctx, message, message.Length, context.playerId)) { RemoveCentral(ctx); } else { ++index; } } } if ((to & 1) != 0) { mCallback.OnReceive(message, context.playerId); } } if (to == 0) { mCallback.OnReceiveDirect(message, context.connectionId); } } Utils.CompactStream(context.receiveBufferReader.BaseStream); }