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