4.8 KiB
4.8 KiB
Socket通信现代化改进总结
改进内容
本次改进对原有的Unix Socket通信机制进行了全面重构,实现了更加现代化、结构化的双向通信协议,并添加了实时监听终端窗口大小变化的功能。
主要特性
1. 结构化消息协议
- 消息头设计:采用固定16字节的消息头,包含魔数、类型、载荷长度
- 魔数验证:使用
0x42534D54("BSMT") 作为魔数,确保协议正确性 - 类型安全:明确定义消息类型枚举,避免混淆
2. 实时窗口大小监听
- 信号驱动:使用
SIGWINCH信号捕获终端窗口大小变化 - 独立线程:专门的监控线程处理窗口事件,不阻塞主流程
- 自动同步:窗口大小变化时自动发送更新消息给服务端
3. 双向通信
- 客户端 → 服务端:初始化消息、窗口大小更新
- 服务端 → 客户端:响应消息、关闭通知
- 并发处理:使用多线程/goroutine 同时处理双向消息
4. 线程安全
- 使用
pthread_mutex保护共享资源 - 使用
sig_atomic_t处理信号标志 - Go 端使用 channel 控制 goroutine 生命周期
文件变更
新增文件
-
src/socket_protocol.h- 协议定义头文件- 消息类型枚举
- 消息头结构
- 终端信息结构
- 函数声明
-
src/socket_protocol.c- 协议实现write_message()- 发送结构化消息read_message()- 读取结构化消息free_message_payload()- 释放消息载荷
-
tests/test_window_resize.c- 窗口大小测试程序- 演示实时窗口监听功能
- 交互式测试工具
-
SOCKET_PROTOCOL.md- 协议文档- 详细的协议说明
- 使用示例
- 架构设计文档
修改文件
-
src/client.c- 完全重构- 添加 SIGWINCH 信号处理器
- 实现窗口监控线程
- 使用新的消息协议
- 添加响应监听线程
-
internal/services/tasks/socket.go- Go服务端重构- 实现新的消息读写函数
- 添加消息类型常量
- 实现窗口大小更新监听
- 优化错误处理
-
Makefile- 更新编译规则- 添加
socket_protocol.o依赖 - 添加新测试目标
- 添加
使用方法
编译
cd execve_hook
make clean
make
# 编译测试程序
make test_window_resize
测试窗口大小监听
- 启动Go服务端:
cd go_service
sudo ./build/bash_go_service-amd64 daemon
- 运行测试程序:
cd execve_hook
./build/test_window_resize
-
在程序运行时调整终端窗口大小
-
观察服务端日志输出窗口大小更新信息
开启调试模式
make DEBUG=1
make test_window_resize
技术亮点
1. 现代C编程实践
- 使用
pthread多线程 - 使用
sigaction处理信号(而非过时的signal) - 结构化错误处理
- 内存管理规范(malloc/free配对)
2. 高效的消息序列化
- 使用二进制协议,避免文本解析开销
- 固定头部 + 可变载荷设计
- 支持零拷贝传输(直接读写buffer)
3. 并发模型
-
C端:
- 主线程:发送初始消息
- 窗口监控线程:监听SIGWINCH信号
- 响应监听线程:接收服务端消息
-
Go端:
- 主goroutine:处理业务逻辑
- 监听goroutine:接收客户端更新消息
4. 协议扩展性
设计的消息类型枚举支持轻松添加新消息类型:
typedef enum {
MSG_TYPE_INIT = 1,
MSG_TYPE_WINDOW_SIZE_UPDATE = 2,
MSG_TYPE_SERVER_RESPONSE = 3,
MSG_TYPE_CLOSE = 4,
// 可以继续添加新类型...
MSG_TYPE_HEARTBEAT = 5,
MSG_TYPE_FILE_TRANSFER = 6,
// ...
} MessageType;
性能考虑
- 轮询间隔:100ms,平衡响应性和CPU使用
- 消息大小:终端信息约60-80字节,网络开销小
- 内存使用:动态分配,用完即释放
- 线程数量:固定3个线程(C端),不会无限增长
兼容性
- Linux内核: 2.6+(支持SIGWINCH信号)
- Glibc: 2.17+(pthread支持)
- Go版本: 1.16+
未来优化方向
- 去重机制:连续相同窗口大小不重复发送
- 批量更新:合并短时间内的多次变化
- 心跳机制:检测连接状态
- 压缩传输:对大载荷使用压缩
- 加密通信:添加消息加密层
测试覆盖
- ✓ 基本消息收发
- ✓ 窗口大小监听
- ✓ 多线程并发
- ✓ 异常断开处理
- ✓ 大载荷传输
- ⚠ 压力测试(待完善)
- ⚠ 内存泄漏检测(待完善)
总结
本次改进将原有的简单socket通信升级为现代化的、可扩展的双向通信机制。通过采用结构化协议、多线程设计和信号驱动机制,实现了实时监听终端窗口大小变化的功能,为后续更多实时交互特性奠定了基础。