示例#1
0
        public static async Task WriteAsync(Stream stream, byte[] messageHeader, Ack ack,
                                            IpcMessageCommandType ipcMessageCommandType, byte[] buffer, int offset,
                                            int count, string?summary, ILogger logger)
        {
            logger.Debug($"[{nameof(IpcMessageConverter)}] Start Write {summary}");

            VerifyMessageLength(count);

            var binaryWriter = await WriteHeaderAsync(stream, messageHeader, ack, ipcMessageCommandType);

            await binaryWriter.WriteAsync(count);

            await stream.WriteAsync(buffer, offset, count);

            logger.Debug($"[{nameof(IpcMessageConverter)}] Finished Write {summary}");
        }
        /// <summary>
        /// 和其他的合并然后创建新的
        /// </summary>
        /// <param name="summary">表示写入的是什么内容,用于调试</param>
        /// <param name="ipcMessageCommandType"></param>
        /// <param name="mergeBefore">将加入的内容合并到新的消息前面,为 true 合并到前面,否则合并到后面</param>
        /// <param name="ipcBufferMessageList"></param>
        /// <returns></returns>
        public IpcBufferMessageContext BuildWithCombine(string summary, IpcMessageCommandType ipcMessageCommandType, bool mergeBefore, params IpcBufferMessage[] ipcBufferMessageList)
        {
            var newIpcBufferMessageList = new List <IpcBufferMessage>(ipcBufferMessageList.Length + IpcBufferMessageList.Length);

            if (mergeBefore)
            {
                newIpcBufferMessageList.AddRange(ipcBufferMessageList);
                newIpcBufferMessageList.AddRange(IpcBufferMessageList);
            }
            else
            {
                newIpcBufferMessageList.AddRange(IpcBufferMessageList);
                newIpcBufferMessageList.AddRange(ipcBufferMessageList);
            }

            return(new IpcBufferMessageContext(summary, ipcMessageCommandType, newIpcBufferMessageList.ToArray()));
        }
示例#3
0
        public static async Task <AsyncBinaryWriter> WriteHeaderAsync(Stream stream, byte[] messageHeader, Ack ack,
                                                                      IpcMessageCommandType ipcMessageCommandType)
        {
            /*
             * UInt16 Message Header Length 消息头的长度
             * byte[] Message Header        消息头的内容
             * UInt32 Version        当前IPC服务的版本
             * UInt64 Ack            用于给对方确认收到消息使用
             * UInt32 Empty          给以后版本使用的值
             * UInt16 Command Type   命令类型,业务端的值将会是 0 而框架层采用其他值
             * UInt32 Content Length 这条消息的内容长度
             * byte[] Content        实际的内容
             */

            // 当前版本默认是 1 版本,这个值用来后续如果有协议上的更改时,兼容旧版本使用
            // - 版本是 0 的版本,每条消息都有回复 ack 的值
            const uint version = 1;

            var asyncBinaryWriter   = new AsyncBinaryWriter(stream);
            var messageHeaderLength = (ushort)messageHeader.Length;
            await asyncBinaryWriter.WriteAsync(messageHeaderLength);

            await stream.WriteAsync(messageHeader);

            // UInt32 Version
            await asyncBinaryWriter.WriteAsync(version);

            // UInt64 Ack
            await asyncBinaryWriter.WriteAsync(ack.Value);

            // UInt32 Empty
            await asyncBinaryWriter.WriteAsync(uint.MinValue);

            // UInt16 Command Type   命令类型,业务端的值将会是 0 而框架层采用其他值
            ushort commandType = (ushort)ipcMessageCommandType;
            await asyncBinaryWriter.WriteAsync(commandType);

            return(asyncBinaryWriter);
        }
 /// <summary>
 /// 和其他的合并然后创建新的
 /// </summary>
 /// <param name="ipcMessageCommandType"></param>
 /// <param name="mergeBefore">将加入的内容合并到新的消息前面,为 true 合并到前面,否则合并到后面</param>
 /// <param name="ipcBufferMessageList"></param>
 /// <returns></returns>
 public IpcBufferMessageContext BuildWithCombine(IpcMessageCommandType ipcMessageCommandType, bool mergeBefore, params IpcBufferMessage[] ipcBufferMessageList)
 => BuildWithCombine(Summary, ipcMessageCommandType, mergeBefore, ipcBufferMessageList);
 /// <summary>
 /// 创建包含多条信息的上下文
 /// </summary>
 /// <param name="summary">表示写入的是什么内容,用于调试</param>
 /// <param name="ipcMessageCommandType">命令类型,用于分开框架内的消息和业务的</param>
 /// <param name="ipcBufferMessageList"></param>
 public IpcBufferMessageContext(string summary, IpcMessageCommandType ipcMessageCommandType, params IpcBufferMessage[] ipcBufferMessageList)
 {
     Summary = summary;
     IpcMessageCommandType = ipcMessageCommandType;
     IpcBufferMessageList  = ipcBufferMessageList;
 }