当前位置: 首页 > news >正文

【进程间通信】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 os

SERVER_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_PATH

while True:
    conn, addr = sock.accept()
    try:
        while True:
            data = conn.recv(1024)
            if data:
                print >>sys.stderr, 'received [%s]' % data
                conn.sendall(data)
            else:
                break
    except Exception,e:
         print e
    finally:
        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, msg
    sys.exit(1)
    
try:
    # Send data
    message = 'This is the message, This will be echoed back'
    print >>sys.stderr, 'sending [%s]' % message
    sock.sendall(message)

    amount_received = 0
    amount_expected = len(message)
    
    while amount_received < amount_expected:
        data = sock.recv(1024)
        amount_received += len(data)
        print >>sys.stderr, 'received [%s]' % data

finally:
    print >>sys.stderr, 'closing socket'
    sock.close()

参考文章:https://www.jianshu.com/p/394dd8448400

https://www.cnblogs.com/chekliang/p/3222950.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Redis】Redis数据类型List的安全队列和不安全队列
  • 【多线程】C++11多线程(简约但不简单)
  • 【C++】C++ 不错的学习网站
  • 【C++11】std::async 学习 --- 学习中
  • 【系统】《写给大忙人看的操作系统》--研读
  • 【C++】C++ 4种强制类型转换---编辑中
  • 【Django】Django 的员工信息系统
  • [Django ]Django 的数据库操作
  • 【boost】Windows下VS2017下boost库安装配置
  • 【mySQL】C++操作mySql数据库(Mysql connector c++)
  • [多线程]多线程编程需要注意的问题|多进程
  • 【开发者手册】开发者手册
  • 【C++11】C++11 多线程编程
  • 【多线程】c++11多线程编程(一)——初识
  • 【C++11】C++11 中的std::function和std::bind
  • 【译】JS基础算法脚本:字符串结尾
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Leetcode 27 Remove Element
  • Mac转Windows的拯救指南
  • markdown编辑器简评
  • MySQL用户中的%到底包不包括localhost?
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • 后端_ThinkPHP5
  • 基于HAProxy的高性能缓存服务器nuster
  • 如何用vue打造一个移动端音乐播放器
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习笔记:对象,原型和继承(1)
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #Z0458. 树的中心2
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++17) optional的使用
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (PADS学习)第二章:原理图绘制 第一部分
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (纯JS)图片裁剪
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (五)网络优化与超参数选择--九五小庞
  • (转)视频码率,帧率和分辨率的联系与区别
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .java 9 找不到符号_java找不到符号
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 获取某一天 在当月是 第几周 函数
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net中应用SQL缓存(实例使用)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Slf4j idea标红Cannot resolve symbol ‘log‘