当前位置: 首页>>代码示例>>C#>>正文


C# ReadState.Clear方法代码示例

本文整理汇总了C#中ReadState.Clear方法的典型用法代码示例。如果您正苦于以下问题:C# ReadState.Clear方法的具体用法?C# ReadState.Clear怎么用?C# ReadState.Clear使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在ReadState的用法示例。


在下文中一共展示了ReadState.Clear方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: ReceiveData

        public static void ReceiveData(List<byte> data, ReadState readState, Action<FrameType, byte[]> processFrame)
        {
            while (data.Count >= 2)
            {
                var isFinal = (data[0] & 128) != 0;
                var frameType = (FrameType)(data[0] & 15);
                var isMasked = (data[1] & 128) != 0;
                var length = (data[1] & 127);

                if (!isMasked)
                    throw new WebSocketException("Client data must be masked");

                if (frameType == FrameType.Continuation && !readState.FrameType.HasValue)
                    throw new WebSocketException("Unexpected continuation frame received");

                var index = 2;
                int payloadLength;

                if (length == 127)
                {
                    if (data.Count < index + 8)
                        return; //Not complete
                    payloadLength = data.Skip(index).Take(8).ToArray().ToLittleEndianInt();
                    index += 8;
                }
                else if (length == 126)
                {
                    if (data.Count < index + 2)
                        return; //Not complete
                    payloadLength = data.Skip(index).Take(2).ToArray().ToLittleEndianInt();
                    index += 2;
                }
                else
                {
                    payloadLength = length;
                }

                if (data.Count < index + 4)
                    return; //Not complete

                var maskBytes = data.Skip(index).Take(4).ToArray();

                index += 4;

                if (data.Count < index + payloadLength)
                    return; //Not complete

                var payload = data
                                .Skip(index)
                                .Take(payloadLength)
                                .Select((x, i) => (byte)(x ^ maskBytes[i % 4]));

                readState.Data.AddRange(payload);
                data.RemoveRange(0, index + payloadLength);

                if (frameType != FrameType.Continuation)
                    readState.FrameType = frameType;

                if (isFinal && readState.FrameType.HasValue)
                {
                    var stateData = readState.Data.ToArray();
                    var stateFrameType = readState.FrameType;
                    readState.Clear();

                    processFrame(stateFrameType.Value, stateData);
                }
            }
        }
开发者ID:smerrell,项目名称:Fleck,代码行数:68,代码来源:Hybi13Handler.cs

示例2: ReceiveData

        public static void ReceiveData(List<byte> data, ReadState readState, Fleck2Extensions.Action<FrameType, byte[]> processFrame)
        {
            while (data.Count >= 2)
            {
                var isFinal = (data[0] & 128) != 0;
                var reservedBits = (data[0] & 112);
                var frameType = (FrameType)(data[0] & 15);
                var isMasked = (data[1] & 128) != 0;
                var length = (data[1] & 127);

                if (!isMasked
                    || !Enum.IsDefined(typeof(FrameType), frameType)
                    || reservedBits != 0 //Must be zero per spec 5.2
                    || (frameType == FrameType.Continuation && !readState.FrameType.HasValue))
                    throw new WebSocketException(WebSocketStatusCodes.ProtocolError);

                var index = 2;
                int payloadLength;

                switch (length)
                {
                    case 127:
                        if (data.Count < index + 8)
                            return; //Not complete
                        payloadLength = data.Skip(index).Take(8).ToArray().ToLittleEndianInt();
                        index += 8;
                        break;
                    case 126:
                        if (data.Count < index + 2)
                            return; //Not complete
                        payloadLength = data.Skip(index).Take(2).ToArray().ToLittleEndianInt();
                        index += 2;
                        break;
                    default:
                        payloadLength = length;
                        break;
                }

                if (data.Count < index + 4)
                    return; //Not complete

                var maskBytes = data.Skip(index).Take(4).ToList();

                index += 4;

                if (data.Count < index + payloadLength)
                    return; //Not complete

                var i = 0;
                var payload = data.Skip(index)
                              .Take(payloadLength)
                              .Select(value => (byte)(value ^ maskBytes[i++ % 4]));

                readState.Data.AddRange(payload);
                data.RemoveRange(0, index + payloadLength);

                if (frameType != FrameType.Continuation)
                    readState.FrameType = frameType;

                if (!isFinal || !readState.FrameType.HasValue)
                {
                    continue;
                }

                var stateData = readState.Data.ToArray();
                var stateFrameType = readState.FrameType;
                readState.Clear();

                processFrame(stateFrameType.Value, stateData);
            }
        }
开发者ID:peters,项目名称:Fleck2,代码行数:71,代码来源:Hybi13Handler.cs

示例3: ReceiveData

        public static void ReceiveData(List<byte> data, ReadState readState, Action<FrameType, byte[]> processFrame)
        {
            while (data.Count >= 2)
            {
                var isFinal = (data[0] & 128) != 0;
                var reservedBits = (data[0] & 112);
                var frameType = (FrameType)(data[0] & 15);
                var isMasked = (data[1] & 128) != 0;
                var length = (data[1] & 127);
                var isControlFrame = (data[0]&15) >= 0x08 && (data[0]&15) <= 0x0F;

                if (!isMasked
                    || !Enum.IsDefined(typeof(FrameType), frameType)
                    || reservedBits != 0 //Must be zero per spec 5.2
                    || (frameType == FrameType.Continuation && !readState.FrameType.HasValue))
                    throw new WebSocketException(WebSocketStatusCodes.ProtocolError);

                var index = 2;
                int payloadLength;

                // control frame types may only have a maximum payload length of 125 (autobahn test case 2.5)
                if (isControlFrame && length > 125)
                    throw new WebSocketException(WebSocketStatusCodes.ProtocolError);

                // control frames must not be fragmented (autobahn test case 5.1)
                if (isControlFrame && !isFinal)
                    throw new WebSocketException(WebSocketStatusCodes.ProtocolError);

                // a close frame MAY contain data, but if it does, it must be at least 2 bytes (autobahn test case 7.3.2)
                if (frameType == FrameType.Close && length == 1)
                    throw new WebSocketException(WebSocketStatusCodes.ProtocolError);

                if (length == 127)
                {
                    if (data.Count < index + 8)
                        return; //Not complete
                    payloadLength = data.Skip(index).Take(8).ToArray().ToLittleEndianInt();
                    index += 8;
                }
                else if (length == 126)
                {
                    if (data.Count < index + 2)
                        return; //Not complete
                    payloadLength = data.Skip(index).Take(2).ToArray().ToLittleEndianInt();
                    index += 2;
                }
                else
                {
                    payloadLength = length;
                }

                if (data.Count < index + 4)
                    return; //Not complete

                var maskBytes = data.Skip(index).Take(4).ToArray();

                index += 4;

                if (data.Count < index + payloadLength)
                    return; //Not complete

                var payload = data
                                .Skip(index)
                                .Take(payloadLength)
                                .Select((x, i) => (byte)(x ^ maskBytes[i % 4]));

                // control frames are processed immediatly (since they cannot be fragmented) and can be receive in between
                // and can be received and processed between a fragmented frame (autobahn test case 5.6)
                if (isControlFrame)
                {
                    processFrame(frameType, payload.ToArray());
                    data.RemoveRange(0, index + payloadLength);
                }
                else
                {
                    readState.Data.AddRange(payload);
                    data.RemoveRange(0, index + payloadLength);

                    // frame types for multiple fragments are sent on the first frame, and the rest of the fragments must
                    // have a frame type of continuation (autobahn test case 5.18)
                    if (readState.FragmentNumber == 1)
                        readState.FrameType = frameType;
                    else if(frameType != FrameType.Continuation)
                        throw new WebSocketException(WebSocketStatusCodes.ProtocolError);

                    readState.FragmentNumber++;

                    if (isFinal && readState.FrameType.HasValue)
                    {
                        var stateData = readState.Data.ToArray();
                        var stateFrameType = readState.FrameType;
                        readState.Clear();

                        processFrame(stateFrameType.Value, stateData);
                    }
                }
            }
        }
开发者ID:ccsystems,项目名称:Fleck,代码行数:98,代码来源:Hybi13Handler.cs


注:本文中的ReadState.Clear方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。