コード例 #1
0
        internal void SendResponse(ChannelRequest request, RpcResponse response)
        {
            MessagePackSerializer <RpcMessage> serializer = _serverContext.SerializationContext.Serializer;

            using (var stream = new MemoryStream())
            {
                var writer = new BinaryWriter(stream);
                writer.Write((byte)0);
                writer.Write((byte)0);
                writer.Write((byte)request.FrameId);
                writer.Write((byte)0);
                writer.Write((int)0); // Dummy value replaced

                int prevPos = (int)stream.Position;
                serializer.Pack(stream, response);
                int bodyLen = (int)stream.Position - prevPos;

                // Set the body len to frame head

                stream.Seek(4, SeekOrigin.Begin);
                writer.Write((int)bodyLen);

                byte[] buffer = stream.GetBuffer();
                _sock.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, OnSend, null);
            }
        }
コード例 #2
0
        internal void SendResponse(ChannelRequest request, RpcResponse response)
        {
            MessagePackSerializer<RpcMessage> serializer = _serverContext.SerializationContext.Serializer;

            using (var stream = new MemoryStream())
            {
                var writer = new BinaryWriter(stream);
                writer.Write((byte)0);
                writer.Write((byte)0);
                writer.Write((byte)request.FrameId);
                writer.Write((byte)0);
                writer.Write((int)0); // Dummy value replaced

                int prevPos = (int)stream.Position;
                serializer.Pack(stream, response);
                int bodyLen = (int)stream.Position - prevPos;

                // Set the body len to frame head

                stream.Seek(4, SeekOrigin.Begin);
                writer.Write((int)bodyLen);

                byte[] buffer = stream.GetBuffer();
                _sock.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, OnSend, null);
            }
        }
コード例 #3
0
        private void ProcessFrames(BinaryReader reader, ref int recvBytes, ref RpcFrame frame)
        {
            bool continueRead = false;

            do
            {
                if (frame == null && recvBytes >= 8)
                {
                    // Frame received
                    byte version = reader.ReadByte();
                    byte reserved = reader.ReadByte();
                    byte frameId = reader.ReadByte();
                    byte protocolCode = reader.ReadByte();
                    int bodyLen = reader.ReadInt32();

                    if (version == 1 && reserved == 0 && protocolCode == 0)
                    {
                        if (bodyLen >= 0 && bodyLen <= MAX_BODY_SIZE)
                        {
                            frame = new RpcFrame();
                            frame.FrameId = frameId;
                            frame.BodyLen = bodyLen;
                        }
                        else
                        {
                            // Invalid header
                        }
                    }
                    else
                    {
                        // Invalid header, close the connection
                    }

                    recvBytes -= 8;
                    continueRead = true;
                }

                if (frame != null)
                {
                    if (frame.BodyLen == 0)
                    {
                        frame = null; // Start reading of next frame
                        continueRead = true;
                    }
                    else if (recvBytes >= frame.BodyLen)
                    {
                        // Frame body received

                        byte[] frameBody = reader.ReadBytes(frame.BodyLen);

                        MessagePackSerializer<RpcMessage> serializer = _serverContext.SerializationContext.Serializer;
                        RpcRequest request = (RpcRequest)serializer.UnpackSingleObject(frameBody);

                        ChannelRequest channelRequest = new ChannelRequest(this, frame.FrameId, request);

                        _serverContext.RequestDispatcher.DispatchRequest(channelRequest);

                        recvBytes -= frame.BodyLen;
                        frame = null; // Start reading of next frame
                        continueRead = true;
                    }
                }
            }
            while (continueRead);
        }
コード例 #4
0
        private void ProcessFrames(BinaryReader reader, ref int recvBytes, ref RpcFrame frame)
        {
            bool continueRead = false;

            do
            {
                if (frame == null && recvBytes >= 8)
                {
                    // Frame received
                    byte version      = reader.ReadByte();
                    byte reserved     = reader.ReadByte();
                    byte frameId      = reader.ReadByte();
                    byte protocolCode = reader.ReadByte();
                    int  bodyLen      = reader.ReadInt32();

                    if (version == 1 && reserved == 0 && protocolCode == 0)
                    {
                        if (bodyLen >= 0 && bodyLen <= MAX_BODY_SIZE)
                        {
                            frame         = new RpcFrame();
                            frame.FrameId = frameId;
                            frame.BodyLen = bodyLen;
                        }
                        else
                        {
                            // Invalid header
                        }
                    }
                    else
                    {
                        // Invalid header, close the connection
                    }

                    recvBytes   -= 8;
                    continueRead = true;
                }

                if (frame != null)
                {
                    if (frame.BodyLen == 0)
                    {
                        frame        = null; // Start reading of next frame
                        continueRead = true;
                    }
                    else if (recvBytes >= frame.BodyLen)
                    {
                        // Frame body received

                        byte[] frameBody = reader.ReadBytes(frame.BodyLen);

                        MessagePackSerializer <RpcMessage> serializer = _serverContext.SerializationContext.Serializer;
                        RpcRequest request = (RpcRequest)serializer.UnpackSingleObject(frameBody);

                        ChannelRequest channelRequest = new ChannelRequest(this, frame.FrameId, request);

                        _serverContext.RequestDispatcher.DispatchRequest(channelRequest);

                        recvBytes   -= frame.BodyLen;
                        frame        = null; // Start reading of next frame
                        continueRead = true;
                    }
                }
            }while (continueRead);
        }