LINUX socket 本地套接字
一、本地套接字本质
-
特殊文件类型
Linux将套接字封装为伪文件(内核缓冲区实现),通过文件描述符操作,统一了文件/套接字的接口规范1。 -
与管道的区别
特性 本地套接字 管道(Pipe) 通信范围 同一主机任意进程 父子进程/兄弟进程 通信模式 支持字节流/数据报 仅字节流 寻址方式 文件路径标识 无显式标识 双向通信 支持 单向
二、核心使用流程
1. 创建套接字
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); // 字节流模式(TCP风格) // 或 SOCK_DGRAM 数据报模式(UDP风格)
关键参数:
-
AF_UNIX:指定本地套接字协议族 -
SOCK_STREAM:可靠双向字节流(类似TCP) -
SOCK_DGRAM:保留消息边界的数据报(类似UDP)2
2. 绑定地址
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/tmp/mysocket.sock", sizeof(addr.sun_path)-1);
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
注意:
-
sun_path需使用绝对路径,文件权限需开放(建议chmod 777 /tmp/mysocket.sock) -
绑定后生成socket文件,退出时需手动删除3
3. 通信实现(以SOCK_STREAM为例)
服务端:
listen(sockfd, 5); // 设置监听队列长度
int client_fd = accept(sockfd, NULL, NULL); // 阻塞等待连接
read(client_fd, buffer, sizeof(buffer)); // 接收数据
客户端:
connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)); // 连接服务端
write(sockfd, "Hello", 6); // 发送数据
三、技术优势分析
-
性能优势
-
无网络协议栈开销,传输速度比TCP/IP快2倍以上
-
零拷贝技术支持,减少内核/用户空间数据复制3
-
-
安全性
-
通过文件系统权限控制访问(
chown/chmod) -
数据不经过网络,避免窃听风险
-
-
可靠性
-
内核保证数据有序到达(SOCK_STREAM模式)
-
自动处理消息边界(SOCK_DGRAM模式)
-
四、典型应用场景
-
数据库连接
MySQL默认使用/var/run/mysqld/mysqld.sock进行本地高效通信 -
容器间通信
Docker容器通过/var/run/docker.sock与守护进程交互 -
进程监控工具
如systemd使用/run/systemd/private管理服务进程 -
X Window系统
图形应用通过/tmp/.X11-unix/X0传递显示数据
五、监控与管理
Bash
# 查看套接字统计 cat /proc/net/sockstat
# 输出示例: # sockets: used 87 # UNIX: inuse 15 # 关注此项
# 列出所有打开的UNIX套接字 sudo lsof -U -c <进程名>
输出字段含义:
-
inuse:当前使用中的套接字数量 -
tw:TIME_WAIT状态套接字4
六、注意事项
-
路径长度限制:
sun_path最大108字节(包括终止符) -
清理机制:程序退出后需主动调用
unlink()删除socket文件 -
权限控制:避免使用
/tmp等公开目录,建议采用/run/<app>/专用目录
更多推荐
所有评论(0)