public WebSocketFrameInfo( WebSocketFrameType type, bool isFinal, bool masked, byte[] maskBytes, int payloadDataLen) { this.Type = type; this.IsFinal = isFinal; this.Masked = masked; this.MaskBytes = maskBytes; this.PayloadDataLen = payloadDataLen; }
static public byte GetFrameOpCode(WebSocketFrameType frameType) { switch (frameType) { case WebSocketFrameType.Text: return(0x1); case WebSocketFrameType.Binary: return(0x2); case WebSocketFrameType.Close: return(0x8); case WebSocketFrameType.Ping: return(0x9); case WebSocketFrameType.Pong: return(0xA); } throw new ArgumentOutOfRangeException(nameof(frameType), frameType, null); }
static public void Decode( ByteBuf byteBuf, byte[] maskBytes, out WebSocketFrameType type, out bool fin, out bool masked, out int payloadLen) { if (byteBuf.ReadableBytes() < 2) { throw new UnexpectedEndOfBufferException(); } byte headerByte1 = byteBuf.ReadByte(); byte headerByte2 = byteBuf.ReadByte(); fin = (headerByte1 & Utils.MaskFin) == Utils.MaskFin; byte opCode = (byte)(headerByte1 & Utils.MaskOpCode); masked = (headerByte2 & Utils.MaskMask) == Utils.MaskMask; payloadLen = (byte)(headerByte2 & Utils.MaskPayloadLen); type = Utils.GetFrameType(opCode); if (payloadLen > 125) { payloadLen = ReadExtPayloadLen(byteBuf, payloadLen); } if (masked) { ReadMask(byteBuf, maskBytes); } if (byteBuf.ReadableBytes() < payloadLen) { throw new UnexpectedEndOfBufferException(); } }
internal WebSocketPacket ReadPacket() { var receivePacketEventArg = new SocketAsyncEventArgs(); receivePacketEventArg.RemoteEndPoint = _socket.RemoteEndPoint; Debug.WriteLine("Reading metadata"); var flagMaskAndPayloadMetadata = ReadDataFromSocket(receivePacketEventArg, 2); //var fragmented = false; //read the first byte var flag = (int)flagMaskAndPayloadMetadata[0]; //if ((flag & 0x80) == 0x00) //{ // fragmented = true; //} byte[] payload = null; bool masked = true; byte[] mask = null; var opcode = flag & 0x0F; WebSocketFrameType frameType = (WebSocketFrameType)opcode; if (frameType == WebSocketFrameType.INVALID) { //TODO - throw exception } else { Debug.WriteLine("Reading payload length"); //read the payload length var payLoadLength = (int)flagMaskAndPayloadMetadata[1]; masked = (payLoadLength & 0x80) == 0x80; payLoadLength &= 0x7F; if (payLoadLength == 126) { var payLoadMetaData = ReadDataFromSocket(receivePacketEventArg, 2); payLoadLength = ((int)payLoadMetaData[0]) & 0xFF; payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData[1]) & 0xFF); } else if (payLoadLength == 127) { var payLoadMetaData1 = ReadDataFromSocket(receivePacketEventArg, 8); payLoadLength = payLoadMetaData1[0] & 0xFF; payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[1]) & 0xFF); payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[2]) & 0xFF); payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[3]) & 0xFF); payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[4]) & 0xFF); payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[5]) & 0xFF); payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[6]) & 0xFF); payLoadLength = (payLoadLength << 8) ^ (((int)payLoadMetaData1[7]) & 0xFF); } if (masked) { mask = ReadDataFromSocket(receivePacketEventArg, 4); } if (payLoadLength > 0) { payload = ReadDataFromSocket(receivePacketEventArg, payLoadLength); if (masked) { //TODO - implement for masking } } } return(new WebSocketRawPacket(frameType, payload)); }
public static byte[] RawToProtocolPacket(WebSocketPacket aDataPacket) { byte[] lBuff = new byte[2]; WebSocketFrameType lFrameType = aDataPacket.GetFrameType(); int lTargetType = (int)lFrameType; if (lTargetType.Equals(-1)) { throw new WebSocketRuntimeException("Cannot construct a packet with unknown packet type: " + lFrameType); } if (aDataPacket.IsEndFrame()) { lBuff[0] = (byte)(lTargetType | 0x80); } else { lBuff[0] = (byte)(lTargetType); } int lPayloadLen = aDataPacket.GetByteArray().Length; if (lPayloadLen < 126) { lBuff[1] = (byte)(lPayloadLen | 0x80); } else if (lPayloadLen >= 126 && lPayloadLen < 0xFFFF) { lBuff[1] = (byte)(126 | 0x80); int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 2); lBuff[lSize] = (byte)((lPayloadLen >> 8) & 0xFF); lBuff[lSize + 1] = (byte)(lPayloadLen & 0xFF); } else if (lPayloadLen >= 0xFFFF) { lBuff[1] = (byte)(127 | 0x80); long lLen = (long)lPayloadLen; int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 8); lBuff[lSize] = (byte)(lLen >> 56); lBuff[lSize + 1] = (byte)(lLen >> 48); lBuff[lSize + 2] = (byte)(lLen >> 40); lBuff[lSize + 3] = (byte)(lLen >> 32); lBuff[lSize + 4] = (byte)(lLen >> 24); lBuff[lSize + 5] = (byte)(lLen >> 16); lBuff[lSize + 6] = (byte)(lLen >> 8); lBuff[lSize + 7] = (byte)lLen; } int lSizes = lBuff.Length; lBuff = CopyOf(lBuff, lSizes + 4); lBuff[lSizes] = (byte)mRan.Next(0, 255); lBuff[lSizes + 1] = (byte)mRan.Next(0, 255); lBuff[lSizes + 2] = (byte)mRan.Next(0, 255); lBuff[lSizes + 3] = (byte)mRan.Next(0, 255); byte[] lMask = new byte[4]; Array.Copy(lBuff, lBuff.Length - 4, lMask, 0, 4); byte[] lBuffData = new byte[aDataPacket.GetByteArray().Length]; Array.Copy(aDataPacket.GetByteArray(), 0, lBuffData, 0, lBuffData.Length); byte[] lMaskedData = new byte[lBuffData.Length]; int lPos = 0; for (int i = 0; i < lBuffData.Length; i++) { lMaskedData[i] = (byte)Convert.ToInt32(lBuffData[i] ^ lMask[lPos]); if (lPos == 3) { lPos = 0; } else { lPos++; } } lBuff = CopyOf(lBuff, lBuff.Length + lMaskedData.Length); Array.Copy(lMaskedData, 0, lBuff, lBuff.Length - lMaskedData.Length, lMaskedData.Length); return(lBuff); }
public static WebSocketPacket protocolToRawPacket(Stream aIS) { int lFlags = aIS.ReadByte(); if (lFlags == -1) { return(null); } byte[] lBuff = new byte[0]; bool lFragmented = false; if ((lFlags & 0x80) == 0x00) { lFragmented = true; } bool lMasked = true; int[] lMask = new int[4]; int lOpcode = lFlags & 0x0F; WebSocketFrameType lFrameType = (WebSocketFrameType)lOpcode; if (lFrameType.Equals(WebSocketFrameType.INVALID)) { throw new WebSocketException("Invalid frame type"); } else { long lPayloadLen = Read(aIS); lMasked = (lPayloadLen & 0x80) == 0x80; lPayloadLen &= 0x7F; if (lPayloadLen == 126) { lPayloadLen = Read(aIS) & 0xFF; lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); } else if (lPayloadLen == 127) { lPayloadLen = Read(aIS) & 0xFF; lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); lPayloadLen = (lPayloadLen << 8) ^ (Read(aIS) & 0xFF); } if (lMasked) { lMask[0] = Read(aIS) & 0xFF; lMask[1] = Read(aIS) & 0xFF; lMask[2] = Read(aIS) & 0xFF; lMask[3] = Read(aIS) & 0xFF; } if (lPayloadLen > 0) { if (lMasked) { int j = 0; while (lPayloadLen-- > 0) { WriteByte(ref lBuff, Convert.ToByte(Read(aIS) ^ lMask[j])); j++; j &= 3; } } else { while (lPayloadLen-- > 0) { WriteByte(ref lBuff, (byte)Read(aIS)); } } } } WebSocketPacket lRes = new WebSocketRawPacket(lFrameType, lBuff); return(lRes); }
public WebSocketPacket(WebSocketFrameType aFrameType, string aString) { mFrameType = aFrameType; SetString(aString); }
public WebSocketPacket(WebSocketFrameType aFrameType, byte[] aByteArray) { mFrameType = aFrameType; mByteArray = aByteArray; }
/// <summary> /// 重写发送,记录当前正在发送的数据实例 /// </summary> /// <param name="io"></param> /// <param name="request"></param> /// <param name="frameType"></param> /// <returns></returns> public override int Send(IChannel io, IRequestInfo request, WebSocketFrameType frameType = WebSocketFrameType.Binary) { _sendObject = (SendObject)request.State; return(base.Send(io, request, frameType)); }
public static byte[] RawToProtocolPacket(IWebSocketPacket aDataPacket) { byte[] lBuff = new byte[2]; WebSocketFrameType lFrameType = aDataPacket.FrameType; int lTargetType = (int)lFrameType; if (lTargetType.Equals(-1)) { throw new WebSocketRuntimeException(WebSocketMessage.CANNOT_CONSTRUCT_PACKET + WebSocketMessage.TWO_POINT + lFrameType); } if (aDataPacket.IsFragmented) { lBuff[0] = (byte)(lTargetType | 0x80); } else { lBuff[0] = (byte)(lTargetType); } int lPayloadLen = aDataPacket.ByteArray.Length; if (lPayloadLen < 126) { lBuff[1] = (byte)(lPayloadLen | 0x80); } else if (lPayloadLen >= 126 && lPayloadLen < 0xFFFF) { lBuff[1] = (byte)(126 | 0x80); int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 2); lBuff[lSize] = (byte)((lPayloadLen >> 8) & 0xFF); lBuff[lSize + 1] = (byte)(lPayloadLen & 0xFF); } else if (lPayloadLen >= 0xFFFF) { lBuff[1] = (byte)(127 | 0x80); long lLen = (long)lPayloadLen; int lSize = lBuff.Length; lBuff = CopyOf(lBuff, lSize + 8); lBuff[lSize] = (byte)(lLen >> 56); lBuff[lSize + 1] = (byte)(lLen >> 48); lBuff[lSize + 2] = (byte)(lLen >> 40); lBuff[lSize + 3] = (byte)(lLen >> 32); lBuff[lSize + 4] = (byte)(lLen >> 24); lBuff[lSize + 5] = (byte)(lLen >> 16); lBuff[lSize + 6] = (byte)(lLen >> 8); lBuff[lSize + 7] = (byte)lLen; } int lSizes = lBuff.Length; lBuff = CopyOf(lBuff, lSizes + 4); lBuff[lSizes] = (byte)mRan.Next(0, 255); lBuff[lSizes + 1] = (byte)mRan.Next(0, 255); lBuff[lSizes + 2] = (byte)mRan.Next(0, 255); lBuff[lSizes + 3] = (byte)mRan.Next(0, 255); byte[] lMask = new byte[4]; Array.Copy(lBuff, lBuff.Length - 4, lMask, 0, 4); byte[] lBuffData = new byte[aDataPacket.ByteArray.Length]; Array.Copy(aDataPacket.ByteArray, 0, lBuffData, 0, lBuffData.Length); byte[] lMaskedData = new byte[lBuffData.Length]; int lPos = 0; for (int i = 0; i < lBuffData.Length; i++) { lMaskedData[i] = (byte)Convert.ToInt32(lBuffData[i] ^ lMask[lPos]); if (lPos == 3) { lPos = 0; } else { lPos++; } } lBuff = CopyOf(lBuff, lBuff.Length + lMaskedData.Length); Array.Copy(lMaskedData, 0, lBuff, lBuff.Length - lMaskedData.Length, lMaskedData.Length); return(lBuff); }
public void SetFrameType(WebSocketFrameType aFrameType) { mFrameType = aFrameType; }
static public void Encode( ByteBuf outByteBuf, ByteBuf inByteBuf, byte[] maskBytes, WebSocketFrameType type, bool fin, bool masked, int payloadLen) { if (payloadLen > 65535) { throw new LargeWebSocketFramesNotSupportedException(payloadLen); } int totalDataLen = 2 /* mandatoryHeader */ + payloadLen /* payload */ + (masked ? 4 : 0) /* mask */ + (payloadLen <= 125 ? 0 : 2) /* ext payload */; if (totalDataLen > outByteBuf.WritableBytes()) { throw new NotEnoughAvailableBufferSizeToWriteException(outByteBuf.WritableBytes(), totalDataLen); } byte opCode = Utils.GetFrameOpCode(type); if (fin) { opCode = (byte)(opCode | Utils.MaskFin); } outByteBuf.Write(opCode); byte payloadLenAndMask; if (payloadLen <= 125) { payloadLenAndMask = (byte)payloadLen; } else { payloadLenAndMask = 126; } byte payloadLenByte = payloadLenAndMask; if (masked) { payloadLenAndMask = (byte)(payloadLenAndMask | Utils.MaskMask); } outByteBuf.Write(payloadLenAndMask); if (payloadLenByte == 126) { ByteConverters.ByteUnion2 byteUnion2 = new ByteConverters.ByteUnion2(); byteUnion2.UShort = (ushort)payloadLen; outByteBuf.Write(byteUnion2.B2); outByteBuf.Write(byteUnion2.B1); } if (masked) { outByteBuf.Write(maskBytes[3]); outByteBuf.Write(maskBytes[2]); outByteBuf.Write(maskBytes[1]); outByteBuf.Write(maskBytes[0]); } // TODO: оптимизация for (int i = 0; i < payloadLen; i++) { byte @byte = inByteBuf.ReadByte(); if (masked) { outByteBuf.Write((byte)(@byte ^ maskBytes[i % 4])); } else { outByteBuf.Write(@byte); } } }