通道与内存通道
IChannel
头文件:<dlt698/transport/channel.hpp>,命名空间 dlt698::transport。
通用语义
这些约定对所有通道实现成立(TcpChannel、SerialChannel、MemoryChannel、SerialLinkChannel):
写完成 ≠ 远端处理完成
async_write 成功表示全部字节已经交给底层驱动或对端缓存,不代表远端已经处理。内存通道写入成功表示整块已进入对端缓存;串口写完成表示全部交给驱动,尚不能证明物理线路排空。
ChannelOptions
read_chunk_bytes 范围是 1 至 1 MiB。两个写入上限都必须非零。
条数预算里空写也占一条。
MemoryChannel
头文件:<dlt698/transport/memory.hpp>。
pair 返回一对已连接的通道,共享同一个执行器,可以分别绑定协议客户机和服务器。执行器为空或配置非法(各项非零)时抛 std::invalid_argument。
预算语义
MemoryOptions 限制读取分块、每端缓存与排队写字节、排队写条数。预算不足返回 resource_limit,不执行部分写入——不会出现"写了一半"的中间状态。
销毁顺序
~MemoryChannel() 关闭本端并唤醒双方尚未完成的读取。关闭、销毁与异步完成仍需驱动执行器,否则挂起的回调不会执行。
自己实现通道
如果要接入其他传输方式(比如 UDP 封装、进程管道),实现 IChannel 即可:
async_read必须保证最多一个在途读,第二次返回busy。async_write必须保序,并接管传入的Bytes。- 预算不足时返回
resource_limit,不要部分写入。 - 回调抛出的异常应被隔离并记录。
close()幂等,且挂起操作要以错误完成。- 应用须持有通道至操作完成——内部异步操作不会永久保活通道。
只要同时提供一个 IExecutor 实现,整个会话层就能直接复用。