一、本地套接字本质

  1. 特殊文件类型
    Linux将套接字封装为伪文件(内核缓冲区实现),通过文件描述符操作,统一了文件/套接字的接口规范1

  2. 与管道的区别

    特性 本地套接字 管道(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); // 发送数据

三、技术优势分析

  1. 性能优势

    • 无网络协议栈开销,传输速度比TCP/IP快2倍以上

    • 零拷贝技术支持,减少内核/用户空间数据复制3

  2. 安全性

    • 通过文件系统权限控制访问(chown/chmod

    • 数据不经过网络,避免窃听风险

  3. 可靠性

    • 内核保证数据有序到达(SOCK_STREAM模式)

    • 自动处理消息边界(SOCK_DGRAM模式)


四、典型应用场景

  1. 数据库连接
    MySQL默认使用/var/run/mysqld/mysqld.sock进行本地高效通信

  2. 容器间通信
    Docker容器通过/var/run/docker.sock与守护进程交互

  3. 进程监控工具
    如systemd使用/run/systemd/private管理服务进程

  4. 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


六、注意事项

  1. 路径长度限制sun_path最大108字节(包括终止符)

  2. 清理机制:程序退出后需主动调用unlink()删除socket文件

  3. 权限控制:避免使用/tmp等公开目录,建议采用/run/<app>/专用目录


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐