本文详细讲解如何在Linux环境下使用Unix域数据报套接字实现本机进程间通信,包括Unix域套接字的核心概念、关键数据结构、线程模型设计以及完整的双向通信实现。
一、实验目的
使用数据报域套接字实现本机两个进程的通信
二、核心原理/知识点
1. 什么是Unix域套接字
IPC机制:进程间通信(Inter-Process Communication)的一种方式
基于文件系统:使用文件路径作为地址,而不是IP地址和端口
高效通信:只在内核中传输数据,无需网络协议栈处理
仅限本地:只能在同一台主机上的进程间通信
2. 域套接字类型
| 类型 | 特点 | 示例 |
|---|---|---|
| 流式套接字 (SOCK_STREAM) | 面向连接、可靠、双向字节流 | 类似TCP |
| 数据报套接字 (SOCK_DGRAM) | 无连接、不可靠、保留消息边界 | 类似UDP |
三、核心函数详解
3.1 关键API函数
删除已存在的套接字
|
|
3.2 关键数据结构
地址结构
|
|
四、实现步骤分解
1.关键API函数
(1) 创建套接字
|
|
(2) 绑定地址
|
|
(3) 发送数据
|
|
(4) 接收数据
|
|
2. 线程模型设计
4.关键代码片段详解
(1). 接收线程函数
|
|
(2). 主线程发送循环
|
|
五、完整代码实现
fileb:
|
|
fileb:
|
|
重要注意事项
1. 文件路径选择
使用/tmp目录:系统重启自动清理
路径长度限制:sun_path最多108字节
权限问题:确保有权限在目标目录创建文件
2. 线程安全
线程分离:接收线程设置为分离状态可避免资源泄漏
信号处理:考虑添加信号处理,优雅终止线程
资源清理:确保程序退出时删除套接字文件
六、编译与运行
|
|
七、遇到的问题与解决
问题1:bind: Address already in use 现象:程序启动失败,提示地址已被使用 原因:上次运行后套接字文件未删除 解决:确保每次启动前调用unlink()删除文件
问题2:Permission denied 现象:无法在指定路径创建套接字文件 原因:对目标目录没有写权限 解决:使用/tmp目录或确保有足够权限
问题3:消息丢失 现象:发送速度快时部分消息丢失 原因:数据报套接字不保证可靠性 解决:
实现应用层确认机制
使用流式套接字(SOCK_STREAM)
添加消息序列号和重传机制
八、Unix域套接字 vs 其他IPC方式
| IPC方式 | 特点 | 适用场景 |
|---|---|---|
| Unix域套接字 | 类似网络编程接口,支持流和数据报 | 需要类似网络接口的IPC |
| 管道(pipe) | 单向字节流,有亲缘关系限制 | 父子进程间通信 |
| FIFO(命名管道) | 单向字节流,无亲缘关系限制 | 无亲缘关系进程间通信 |
| 消息队列 | 结构化消息,支持优先级 | 需要消息分类的通信 |
| 共享内存 | 最快,需要同步机制 | 大数据量、高性能通信 |
关键收获 ✅
Unix域套接字原理:掌握了基于文件系统的本地IPC机制
双向通信模型:实现了主线程发送+次线程接收的并发模型
地址管理:学会了使用文件路径作为通信地址
资源管理:理解了套接字文件的创建和清理
性能优势
高效:数据直接在内核空间传递,无需网络协议栈
低延迟:比网络套接字通信快2-3倍
安全:仅限于本机通信,无网络暴露风险
应用场景
数据库连接:客户端与本地数据库服务通信
GUI应用:图形界面与后台服务通信
系统服务:系统守护进程间的通信
容器内部:Docker容器内进程间通信
扩展方向
可靠性增强:实现消息确认和重传机制
多客户端支持:扩展为服务器-多客户端模型
性能优化:使用内存映射文件或共享内存
安全增强:添加权限控制和消息加密
导航:
- 上一篇:03-UDP广播编程