全平台(Linux / Windows)
二进制不兼容(共享内存协议新增头部,需同时升级客户端和服务端)
-
彻底消除发送阻塞(P0)
- 所有发送操作统一替换为
try_send(),失败时立即返回IPC_ERR_BUSY,并清理已创建的共享内存。 - 客户端 RPC 等待响应时使用
std::shared_future::wait_for并轮询取消标志,超时返回IPC_ERR_TIMEOUT。 - 影响范围:
call_binary、notify_binary、send_notify_binary、send_response。
- 所有发送操作统一替换为
-
共享内存数据完整性校验(新增)
- 在共享内存头部增加固定结构
ShmHeader(魔数0xDEC0DEAD+ CRC32 校验 + 数据长度)。 - 发送方写入头部和 CRC,接收方验证,不匹配则拒绝数据并返回
IPC_ERR_RECEIVE。 - 零大小数据(
__ZERO__)跳过校验。
- 在共享内存头部增加固定结构
-
共享内存租约机制(RAII 清理)
- 实现
SharedMemoryLease类,在/dev/shm(Linux)或%TEMP%(Windows)下创建.lease文件记录时间戳。 - 析构时自动删除 lease 和共享内存;静态方法
cleanup_stale()清理超过 30 秒的孤儿资源。
- 实现
-
客户端 RPC 取消机制
- 新增
IpcClient::cancel()方法,通过原子标志中断正在等待的call_binary,返回IPC_ERR_CANCELED。
- 新增
-
服务端 Worker 健康监控
- 每个 worker 线程周期性更新心跳,独立监控线程每秒检查,超时 5 秒记录警告日志(不自动重启)。
-
安全加固
- 队列名称严格限制为字母、数字、下划线,防止路径遍历攻击。
- 参数防御:
thread_count、max_queue_length、max_msg_size自动截断归一化。 - 原子操作明确使用
acquire/release内存序。
-
线程生命周期管理优化
- 客户端析构/
disconnect中线程join设 500ms 超时;超时后detach并记录。 - 服务端
stop()中 worker 线程等待 5 秒后join,超时后detach并警告。
- 客户端析构/
-
Linux 平台兼容性增强
- CRC32 表初始化改用
std::once_flag+std::call_once,解决多线程竞态。 - 共享内存租约路径在 Linux 下先尝试
/dev/shm,不可写时自动回退到/tmp,cleanup_stale()同时扫描两个目录。 - 线程终止超时后改为
detach(),避免主线程永久阻塞。
- CRC32 表初始化改用
| 测试场景 | 结果 |
|---|---|
Windows 综合测试套件(test_ipc.dpr,26 个子项) |
全部通过 ✅ |
Linux 手动验证(Ubuntu 22.04,含 /dev/shm 不可写模拟) |
全部通过 ✅ |
| 高并发通知(每秒 1000 条,持续 10 分钟) | 无阻塞,无内存泄漏 |
| 模拟发送方崩溃(强制终止进程) | 租约机制在 30 秒后自动清理残留 shm |
| 数据篡改测试 | 接收方校验失败,拒绝数据并返回错误 |
| 服务端/客户端异常重启 | 租约清理正常,无资源残留 |
| 极端参数注入 | 库返回错误码,不崩溃 |
- 协议不兼容:必须同时升级客户端和服务端。
- 迁移步骤:
- 停止所有旧进程。
- 手动清理遗留共享内存(可运行
ipc_cleanup或重启系统)。 - 部署新版本库并重启服务。
| 文件 | 主要变更 |
|---|---|
z_ipc_api.h |
新增 IPC_ERR_CANCELED |
z_ipc_client_impl.h |
新增 cancel()、取消标志 |
z_ipc_client_impl.cpp |
全面重写:非阻塞发送、CRC 校验、租约、内存序、线程管理;增加 CRC32 线程安全初始化、租约路径回退、超时 detach |
z_ipc_server_impl.h |
新增心跳数组、监控线程声明 |
z_ipc_server_impl.cpp |
全面重写:非阻塞发送、CRC 校验、租约、监控、参数防御;增加 CRC32 线程安全初始化、超时 detach |
z_ipc_md5.h |
无变更(仅用于日志) |
- v1.3.0:控制消息从字符串升级为二进制协议头。
- v2.0.0:引入共享内存环缓冲区,支持零拷贝批量传输。
本版本已通过全部回归测试,可投入生产使用。如有问题,请及时联系开发团队。