【进程间通信】Unix domain socket (进程间通信)
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。
虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。
这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
UNIX Domain Socket是全双工的,API接口语义丰富,相比其它IPC机制有明显的优越性,目前已成为使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。
使用UNIX Domain Socket的过程和网络socket十分相似,也要先调用socket()创建一个socket文件描述符,address family指定为AF_UNIX,type可以选择SOCK_DGRAM或SOCK_STREAM,protocol参数仍然指定为0即可。
UNIX Domain Socket与网络socket编程最明显的不同在于地址格式不同,用结构体sockaddr_un表示,网络编程的socket地址是IP地址加端口号,而UNIX Domain Socket的地址是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已存在,则bind()错误返回。
Unix domain socket和TCP/IP之间有两个重要的不同。
1、socket的地址是文件路径,而不是一个包含ip和端口的元组。
2、在文件系统创建的代表socket的文件在socket关闭后依然存在,并且需要在每次服务器启动时删除。
server.py
import socket
import sys
import osSERVER_PATH = './uds_socket'# Make sure the socket does not already exist
if os.path.exists(SERVER_PATH):os.remove(SERVER_PATH)
print >>sys.stderr ,'starting unix domain socket server'# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Bind the socket to the port
sock.bind(SERVER_PATH)
# Listen for incoming conns
sock.listen(2)
print >>sys.stderr, 'Listening on path: %s' % SERVER_PATHwhile True:conn, addr = sock.accept()try:while True:data = conn.recv(1024)if data:print >>sys.stderr, 'received [%s]' % dataconn.sendall(data)else:breakexcept Exception,e:print efinally:conn.close()
client.py
import socket
import sys# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Connect the socket to the port where the server is listening
server_address = './uds_socket'
print >>sys.stderr, 'connecting to %s' % server_address
try:sock.connect(server_address)
except socket.error, msg:print >>sys.stderr, msgsys.exit(1)try:# Send datamessage = 'This is the message, This will be echoed back'print >>sys.stderr, 'sending [%s]' % messagesock.sendall(message)amount_received = 0amount_expected = len(message)while amount_received < amount_expected:data = sock.recv(1024)amount_received += len(data)print >>sys.stderr, 'received [%s]' % datafinally:print >>sys.stderr, 'closing socket'sock.close()
参考文章:https://www.jianshu.com/p/394dd8448400
https://www.cnblogs.com/chekliang/p/3222950.html
【进程间通信】Unix domain socket (进程间通信)相关推荐
- 【socket】 unix域套接字(socketpair )通信|socketpair和pipe的区别|进程间通信-Unix domain socket
目录 unix域套接字(socketpair )通信|socketpair和pipe的区别 socketpair机制 描述 原理 socketpair和pipe的区别 进程间通信-Unix domai ...
- UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信
文章目录 概述 流程介绍 概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台不同主机上两个进程间通信, 通信之前需要指定IP地址. 但是 ...
- Unix domain socket 简介(进程间通信,进程通信)
Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...
- linux ipc通信,linux-IPC进程通信-UNIX Domain Socket IPC (sockaddr_un) (上)
2011-05-11 15:28 7387人阅读 评论(1) 收藏 分类: C/C++(22) socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制(IPC:即 ...
- 【技术应用】java基于UNIX域套接字(unix domain socket)连接mysql数据库
前言 Unix domain socket 又叫 IPC(inter-process communication 进程间通信)socket,用于实现同一主机上的进程间通信. socket 原本是为网络 ...
- Unix Domain Socket 域套接字实现
主要注意流程: STREAM SOCKET: Server : socket() ---> bind() ---> listen() ---> accept() Client: ...
- 网络协议之:socket协议详解之Unix domain Socket
文章目录 简介 什么是Unix domain Socket 使用socat来创建Unix Domain Sockets 使用ss命令来查看Unix domain Socket 使用nc连接到Unix ...
- unix网络编程之UNIX Domain Socket IPC (sockaddr_un )
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loop ...
- Unix domain socket IPC
UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...
最新文章
- SIM800C SIM卡唯一标识符ICCID
- 获取Moment Js中两个日期之间的小时差异
- esp8266接收到的数据如何存放到数组中_java零基础——数组
- DevOps - 配置管理 - Ansible
- xcode 常用快捷键
- 6月20日云栖精选夜读丨国内首家!阿里云宣布全面提供IPv6服务
- 传真故障排除示例--网络环境存在丢包导致传真失败
- netty cpu 占用率 高_交换机CPU使用率高问题定位
- oracle mysql 数据类型对比_Oracle、SQL Server、MySQL数据类型对比
- 算法设计 分治法 快速排序 C语言实现
- 地域和地方的区别_地方、地域、地区、地面、地段的区别_近义词词典_词林在线词典...
- 以太坊区块链中的数据结构
- ps-抠头发-选择并遮住工具
- python 3 过滤股票
- Verification failed while extracting uws@10.148.2: prebuild-install WARN install No prebuilt binarie
- 作为资深Mac用户,有哪些你相见恨晚的软件值得推荐?
- 波许教授的《最后一课》有感
- unity制作滚动的天空简易版(在b站学的,此处总结,供学习)
- itext实现pdf内容替换
- 阿里云ECS服务器的wordpress博客域名购买、认证、备案、解析以及绑定
热门文章
- git之删除仓库文件
- Coursera视频无法播放解决办法
- 分布式飞机机电综合系统半实物验证环境ETest
- bzoj1613 贝茜的晨练计划
- 流体的“流线”和“迹线”定义和区别。
- Hooks(钩子)监听消息的方法
- gensim bm25模型保存与加载
- 运行计算机配置gpedit,组策略(gpeditmsc)学习
- php7如何加入环境变量
- Java微信开发_Exception_02_errcode:40164,errmsg:invalid ip 61.172.68.219, not in whitelist hint...