示例#1
0
        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);
        }