public void SendFrame(byte streamId, Socket socket) { const byte version = (byte)(FrameType.Request | FrameType.ProtocolVersion); FrameHeaderFlags flags = FrameHeaderFlags.None; if (_tracing) { flags |= FrameHeaderFlags.Tracing; } byte[] header = new byte[4]; header[0] = version; header[1] = (byte)flags; header[2] = streamId; header[3] = (byte)_msgOpcode; SendBuffer(socket, header); int len = (int)_ms.Length; byte[] bodyLen = len.GetBytes(); SendBuffer(socket, bodyLen); // body SendBuffer(socket, _ms.GetBuffer(), 0, len); }
public StreamingFrameReader(Socket socket) { try { SocketReadOnlyStream.SocketReceiveBuffer(socket, _tempBuffer, 0, 9); FrameType version = (FrameType)_tempBuffer[0]; if (0 == (version & FrameType.Response)) { throw new ArgumentException("Expecting response frame"); } if (FrameType.ProtocolVersion != (version & FrameType.ProtocolVersionMask)) { throw new ArgumentException("Unknown protocol version"); } FrameHeaderFlags flags = (FrameHeaderFlags)_tempBuffer[1]; StreamId = (ushort)((_tempBuffer[2] << 8) | _tempBuffer[3]); MessageOpcode = (MessageOpcodes)_tempBuffer[4]; int frameBytesLeft = _tempBuffer.ToInt(5); bool tracing = 0 != (flags & FrameHeaderFlags.Tracing); if (tracing) { SocketReadOnlyStream.SocketReceiveBuffer(socket, _tempBuffer, 0, 16); frameBytesLeft -= 16; TraceId = _tempBuffer.ToGuid(); } // ReSharper disable DoNotCallOverridableMethodsInConstructor ReadOnlyStream = CreateStream(socket, frameBytesLeft); // ReSharper restore DoNotCallOverridableMethodsInConstructor if (MessageOpcodes.Error == MessageOpcode) { ResponseException = CreateExceptionFromError(ReadOnlyStream); } } catch { Dispose(); throw; } }