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); } }
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); } }
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); }
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); }