Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
            }
        }