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 (进程间通信)相关推荐

  1. 【socket】 unix域套接字(socketpair )通信|socketpair和pipe的区别|进程间通信-Unix domain socket

    目录 unix域套接字(socketpair )通信|socketpair和pipe的区别 socketpair机制 描述 原理 socketpair和pipe的区别 进程间通信-Unix domai ...

  2. UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信

    文章目录 概述 流程介绍 概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台不同主机上两个进程间通信, 通信之前需要指定IP地址. 但是 ...

  3. Unix domain socket 简介(进程间通信,进程通信)

    Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...

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

  5. 【技术应用】java基于UNIX域套接字(unix domain socket)连接mysql数据库

    前言 Unix domain socket 又叫 IPC(inter-process communication 进程间通信)socket,用于实现同一主机上的进程间通信. socket 原本是为网络 ...

  6. Unix Domain Socket 域套接字实现

    主要注意流程: STREAM SOCKET: Server :  socket() --->  bind() ---> listen()  ---> accept() Client: ...

  7. 网络协议之:socket协议详解之Unix domain Socket

    文章目录 简介 什么是Unix domain Socket 使用socat来创建Unix Domain Sockets 使用ss命令来查看Unix domain Socket 使用nc连接到Unix ...

  8. unix网络编程之UNIX Domain Socket IPC (sockaddr_un )

    socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loop ...

  9. Unix domain socket IPC

    UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...

最新文章

  1. SIM800C SIM卡唯一标识符ICCID
  2. 获取Moment Js中两个日期之间的小时差异
  3. esp8266接收到的数据如何存放到数组中_java零基础——数组
  4. DevOps - 配置管理 - Ansible
  5. xcode 常用快捷键
  6. 6月20日云栖精选夜读丨国内首家!阿里云宣布全面提供IPv6服务
  7. 传真故障排除示例--网络环境存在丢包导致传真失败
  8. netty cpu 占用率 高_交换机CPU使用率高问题定位
  9. oracle mysql 数据类型对比_Oracle、SQL Server、MySQL数据类型对比
  10. 算法设计 分治法 快速排序 C语言实现
  11. 地域和地方的区别_地方、地域、地区、地面、地段的区别_近义词词典_词林在线词典...
  12. 以太坊区块链中的数据结构
  13. ps-抠头发-选择并遮住工具
  14. python 3 过滤股票
  15. Verification failed while extracting uws@10.148.2: prebuild-install WARN install No prebuilt binarie
  16. 作为资深Mac用户,有哪些你相见恨晚的软件值得推荐?
  17. 波许教授的《最后一课》有感
  18. unity制作滚动的天空简易版(在b站学的,此处总结,供学习)
  19. itext实现pdf内容替换
  20. 阿里云ECS服务器的wordpress博客域名购买、认证、备案、解析以及绑定

热门文章

  1. git之删除仓库文件
  2. Coursera视频无法播放解决办法
  3. 分布式飞机机电综合系统半实物验证环境ETest
  4. bzoj1613 贝茜的晨练计划
  5. 流体的“流线”和“迹线”定义和区别。
  6. Hooks(钩子)监听消息的方法
  7. gensim bm25模型保存与加载
  8. 运行计算机配置gpedit,组策略(gpeditmsc)学习
  9. php7如何加入环境变量
  10. Java微信开发_Exception_02_errcode:40164,errmsg:invalid ip 61.172.68.219, not in whitelist hint...