
linux一切皆文件之Unix domain socket描述符(二)
针对资源占用问题(多次连接导致文件数目增加),建议使用 为提高发送效率,需使用 建议探索第三方库(如ZEROMQ)增强性能,自动管理连接等功能。
发布日期:2025-04-07 11:59:16
浏览次数:7
分类:精选文章
本文共 1693 字,大约阅读时间需要 5 分钟。
Unix域套接字(UDS)实践与分析
在本次实践中,深入探讨了Unix域套接字的工作原理及其在进程间通信中的应用,具体涉及以下环节:
一、入门认识
Unix域套接字(Unix domain socket, UDS)在Linux系统中提供了一种机内通信的高效手段。与网络套接字不同,UDS完全局限于同一台计算机内的进程通信,且其通信机制与文件操作相似,使得进程间的数据交互更加简便高效。
二、代码实践
1. 服务器端文件(server.py)
import socketserver_addr = '/tmp/server.sock'sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)sock.bind(server_addr)sock.listen(0)while True: conn, client_addr = sock.accept() data = conn.recv(100) conn.sendall(data)
2. 客户端文件(client.py)
import socketimport timeserver_addr = '/tmp/server.sock'sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)sock.connect(server_addr)while True: message = 'Hello World!' sock.sendall(message) time.sleep(1) sock.recv(1)
3. 旅程见闻
运行代码,观察到以下关键现象:
服务器进程(pid 2554):
- 打开套接字文件
/tmp/server.sock
,并立即进入监听状态。 - 每次接收客户端连接请求后,创建新的文件描述符(如fd 4)来处理数据传输。
客户端进程(pid 2555):
- 与服务器成功连接,打开用于通信的文件描述符(如fd 3)。
- 定时发送“Hello World!”数据,与服务器进行互动。
内核交互分析(strace输出):
- 服务器(server.py):
- 使用描述符
4
读取数据,调用recvfrom
进行接收,然后立即用同样描述符发送数据。
- 使用描述符
- 客户端(client.py):
- 使用描述符
3
发送数据,然后接收服务器返回的数据,每次等待一秒后继续循环。
- 使用描述符
三、深入剖析
1. 协议与结构
在UDS中,套接字文件/tmp/server.sock
充当唯一标识符,连接建立基于该文件和进程间的文件描述符:
服务器(server.py):
- 通过
socket.bind(server_addr)
将套接字绑定到指定文件。 - 进入监听状态,等待客户端的连接请求。
- 每次接入后,使用同一套接字进行数据交换,确保非阻塞通信。
- 通过
客户端(client.py):
- 通过
socket.connect(server_addr)
与服务器进行连接。 - 定期发送数据至服务器,并接收返回信息,保持通信流程。
- 通过
2. 内核与用户空间交互
通过strace
分析可见,进程在用户空间向内核空间转发数据,套接字将数据存储在内存空间中各自独立的内存段内:
- 服务器和客户端各持有一块内存段,通过描述符表示。
- 数据在内核空间通过套接字结构体传输,回传至客户端。
3. 优势与特点
- 高效性:无需网络协议,直接使用内存进行数据传输,带来低延迟。
- 简易性:操作与标准文件操作类似,便于开发和调试。
- 版内局限性:通信仅限同机,适用于内部需求,XB fairness。
四、小结与调整
setsockopt
或者改用AF_UNIX
的不同方法,如共享句柄。mMSG
功能或技巧分批次读取。通过本次实践,不仅加深了对UDS原理的理解,也掌握了进程间高效通信的实用方法。这为后续的系统设计和优化奠定了坚实基础。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月19日 07时22分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux下jvm、tomcat、mysql、log4j优化配置笔记
2023-02-02
LINUX下KVM的安装与配置
2023-02-02
linux下lamp的搭建及论坛的实现
2023-02-02
Linux下mail服务器应用之邮件系统
2023-02-02
Linux下mail服务器应用之邮件系统的安全性
2023-02-02
Linux下memcache的安装和启动
2023-02-02
linux下mysql5.7修改密码
2023-02-02
linux下mysql8安装
2023-02-02
linux下mysql中文查询得不到结果
2023-02-02
linux下mysql启动和关闭
2023-02-02
Linux下mysql基本操作
2023-02-02
Linux下mysql常用操作命令
2023-02-02
linux下nc的使用
2023-02-02
linux下nodejs安装以及如何更新到最新的版本
2023-02-02
Linux下php动态添加扩展
2023-02-02
Linux下protobuf和 protobuf-c安装使用
2023-02-02
Linux下ps -ef和ps aux的区别及格式详解
2023-02-02
linux下pthread_cancel无法取消线程的原因【转】
2023-02-02
Linux下putenv()函数导致composer更新失败
2023-02-02