public void Reset() { ReaderStep = FrameReaderStep.None; Opcode = 0; FrameFin = 0; FrameMask = 0; FramePayloadLength = 0; FrameMaskingKey = null; }
public bool ProcessFrame(AsyncTcpSession session) { this.position = stream.Position; if (stream.Length == 1) { stream.Position = 0; Byte fin = (Byte)stream.ReadByte(); stream.Position = this.position; int opcode = (fin & 0xf); if (!Opcodes.IsValidCode(opcode)) { return(false); } Opcode = opcode; FrameFin = ((fin & 0x80) >> 7); ReaderStep = FrameReaderStep.FrameFin; curPosition = 1; } else if (stream.Length == 2) { stream.Position = 1; int frameMask = stream.ReadByte(); curPosition = stream.Position; FrameMask = ((frameMask & 0x80) >> 7); ReaderStep = FrameReaderStep.FrameMask; FramePayloadLength = frameMask & 0x7f; if (FramePayloadLength >= 0 && FramePayloadLength <= 0x7d) { //7位长 ReaderStep = FrameReaderStep.PayloadLength; } else if (FramePayloadLength == 0x7E) { //16位长 session.SetNoCheckCount(1); } else if (FramePayloadLength == 0x7F) { //64位长 session.SetNoCheckCount(7); } } else if (ReaderStep == FrameReaderStep.FrameMask) { stream.Position = curPosition; BinaryReader br = new BinaryReader(stream); if (FramePayloadLength == 0x7E) { //16位长 Byte[] tmpBytes = br.ReadBytes(2); tmpBytes = tmpBytes.Reverse().ToArray(); FramePayloadLength = BitConverter.ToUInt16(tmpBytes, 0); } else if (FramePayloadLength == 0x7F) { //64位长 Byte[] tmpBytes = br.ReadBytes(8); tmpBytes = tmpBytes.Reverse().ToArray(); FramePayloadLength = (long)BitConverter.ToUInt64(tmpBytes, 0); } curPosition = stream.Position; if (FramePayloadLength > MaxLength) { session.Close(); return(false); } ReaderStep = FrameReaderStep.PayloadLength; } if (ReaderStep == FrameReaderStep.PayloadLength) { if (FrameMask == 1) { session.SetNoCheckCount(3); ReaderStep = FrameReaderStep.FrameMaskingKey; return(true); } else { if (FramePayloadLength > 0) { session.SetNoCheckCount(FramePayloadLength - 1); DataReadTime = DateTime.Now; ReaderStep = FrameReaderStep.PayoutData; } return(true); } } else if (ReaderStep == FrameReaderStep.FrameMaskingKey) { stream.Position = curPosition; BinaryReader br = new BinaryReader(stream); FrameMaskingKey = br.ReadBytes(4); curPosition = stream.Position; if (FramePayloadLength > 0) { session.SetNoCheckCount(FramePayloadLength - 1); ReaderStep = FrameReaderStep.PayoutData; return(true); } else { ReaderStep = FrameReaderStep.PayoutData; } } //if (ReaderStep == FrameReaderStep.FrameMaskingKey) //{ // if (FramePayloadLength > 0) // { // session.SetNoCheckCount(FramePayloadLength - 1); // ReaderStep = FrameReaderStep.PayoutData; // return true; // } // else // { // ReaderStep = FrameReaderStep.PayoutData; // } //} if (ReaderStep == FrameReaderStep.PayoutData) { if (FramePayloadLength > 0) { stream.Position = curPosition; BinaryReader br = new BinaryReader(stream); if (FrameData != null && FrameData.Length > 0) { Byte[] tmpData = FrameData; logger.Trace("新建:{0}", tmpData.Length + FramePayloadLength); FrameData = new Byte[tmpData.Length + FramePayloadLength]; Array.Copy(tmpData, FrameData, tmpData.Length); Byte[] curData = br.ReadBytes((int)FramePayloadLength); if (FrameMask == 1) { curData.DecodeMask(FrameMaskingKey, 0, curData.Length); } Array.Copy(curData, 0, FrameData, tmpData.Length, curData.Length); } else { FrameData = br.ReadBytes((int)FramePayloadLength); if (FrameMask == 1) { FrameData.DecodeMask(FrameMaskingKey, 0, FrameData.Length); } } } if (FrameFin == 0) { ReaderStep = FrameReaderStep.ContinuationFrame; } else { DataReadTime = DateTime.MinValue; ReaderStep = FrameReaderStep.Completed; } } stream.Position = this.position; return(true); }