Beispiel #1
0
        public override bool TryReadMeaage(WSDataToken dataToken, byte[] buffer, out List <DataMessage> messageList)
        {
            messageList = new List <DataMessage>();
            int offset = 0;

            do
            {
                //check close flag
                if (CheckCloseFlag(buffer, ref offset))
                {
                    messageList.Add(new DataMessage()
                    {
                        Data = buffer, Opcode = Opcode.Close
                    });
                    dataToken.Reset();
                    return(true);
                }
                //receive buffer is complated
                if (!CheckPrefixHeadComplated(dataToken, buffer, ref offset) ||
                    !CheckDataComplated(dataToken, buffer, ref offset))
                {
                    return(false);
                }
                byte[] data = dataToken.ByteArrayForMessage;
                if (data != null)
                {
                    messageList.Add(new DataMessage()
                    {
                        Data = data, Opcode = Opcode.Text
                    });
                }
                dataToken.Reset();
            } while (offset < buffer.Length);
            return(true);
        }
Beispiel #2
0
        public override bool TryReadMeaage(WSDataToken dataToken, byte[] buffer, out List <DataMessage> messageList)
        {
            if (CheckVersion((WebSocket)dataToken.Socket))
            {
                return(base.TryReadMeaage(dataToken, buffer, out messageList));
            }
            messageList = new List <DataMessage>();
            int offset = 0;

            do
            {
                //receive buffer is complated
                if (!CheckPrefixHeadComplated(dataToken, buffer, ref offset) ||
                    !dataToken.HeadFrame.CheckRSV ||
                    !CheckPayloadHeadComplated(dataToken, buffer, ref offset) ||
                    !CheckPayloadDataComplated(dataToken, buffer, ref offset))
                {
                    return(false);
                }
                byte[] data = dataToken.HeadFrame.HasMask
                        ? DecodeMask(dataToken.ByteArrayForMessage, dataToken.ByteArrayMask, 0, dataToken.MessageLength)
                        : dataToken.ByteArrayForMessage;

                if (!dataToken.HeadFrame.FIN)
                {
                    dataToken.DataFrames.Add(new DataSegmentFrame()
                    {
                        Head = dataToken.HeadFrame,
                        Data = new ArraySegment <byte>(data)
                    });
                }
                else
                {
                    //frame complated
                    sbyte opCode;
                    if (dataToken.DataFrames.Count > 0)
                    {
                        dataToken.DataFrames.Add(new DataSegmentFrame()
                        {
                            Head = dataToken.HeadFrame,
                            Data = new ArraySegment <byte>(data)
                        });
                        opCode = dataToken.DataFrames[0].Head.OpCode;
                        data   = CombineDataFrames(dataToken.DataFrames);
                    }
                    else
                    {
                        opCode = dataToken.HeadFrame.OpCode;
                    }
                    messageList.Add(new DataMessage()
                    {
                        Data = data, Opcode = opCode
                    });
                    dataToken.DataFrames.Clear();
                }
                dataToken.Reset();
            } while (offset < buffer.Length);

            return(true);
        }