unix domain socket

unix domain socket 是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC: Inter-Process Communication),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

UNIX Domain Socket可用于两个没有亲缘关系的进程,是全双工的,是目前使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。

UNIX Domain socket与网络socket类似,可以与网络socket对比应用。

上述二者编程的不同如下:

  • address family为AF_UNIX
  • 因为应用于IPC,所以UNIXDomain socket不需要IP和端口,取而代之的是文件路径来表示“网络地址”。这点体现在下面两个方面。
  • 地址格式不同,UNIXDomain socket用结构体sockaddr_un表示,是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已存在,则bind()错误返回。
  • UNIX Domain Socket客户端一般要显式调用bind函数,而不象网络socket一样依赖系统自动分配的地址。客户端bind的socket文件名可以包含客户端的pid,这样服务器就可以区分不同的客户端。

下面用python代码演示uds的使用

Python代码演示

服务端

#!/usr/bin/env python
# -*- coding: utf-8 -*-"""
Created on 12/11/17 11:55 AM
@author: Chen Liang
@function: socket_echo_server_uds
"""import sysreload(sys)
sys.setdefaultencoding('utf-8')
import socket
import osserver_address = './uds_socket'# Make sure the socket does not already exist
try:os.unlink(server_address)
except OSError:if os.path.exists(server_address):raise# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)# Bind the socket to the address
print('starting up on {}'.format(server_address))
sock.bind(server_address)# Listen for incoming connections
sock.listen(1)while True:# Wait for a connectionprint('waiting for a connection')connection, client_address = sock.accept()try:print('connection from', client_address)# Receive the data in small chunks and retransmit itwhile True:data = connection.recv(16)print('received {!r}'.format(data))if data:print('sending data back to the client')connection.sendall(data)else:print('no data from', client_address)breakfinally:# Clean up the connectionconnection.close()

客户端

#!/usr/bin/env python
# -*- coding: utf-8 -*-"""
Created on 12/11/17 11:55 AM
@author: Chen Liang
@function: socket_echo_client_uds
"""import sysreload(sys)
sys.setdefaultencoding('utf-8')import socket
import sys# Create a UDS socket
sock = socket.socket(family=socket.AF_UNIX, type=socket.SOCK_STREAM)# Connect the socket to the port where the server is listening
server_address = './uds_socket'
print('connecting to {}'.format(server_address))
try:sock.connect(server_address)
except socket.error as msg:print(msg)sys.exit(1)try:# Send datamessage = b'This is the message.  It will be repeated.'print('sending {!r}'.format(message))sock.sendall(message)amount_received = 0amount_expected = len(message)while amount_received < amount_expected:data = sock.recv(16)amount_received += len(data)print('received {!r}'.format(data))finally:print('closing socket')sock.close()

客户端一次发送,服务端分批返回。

服务端输出结果如下

root@ubuntu:~/PycharmProjects/python_scripts# python socket_echo_server_uds.py
starting up on ./uds_socket
waiting for a connection
('connection from', '')
received 'This is the mess'
sending data back to the client
received 'age.  It will be'
sending data back to the client
received ' repeated.'
sending data back to the client
received ''
('no data from', '')
waiting for a connection

客户端输出结果如下

root@ubuntu:~/PycharmProjects/python_scripts# python socket_echo_client_uds.py
connecting to ./uds_socket
sending 'This is the message.  It will be repeated.'
received 'This is the mess'
received 'age.  It will be'
received ' repeated.'
closing socket

查看套接字文件的类型如下

root@ubuntu:~/PycharmProjects/python_scripts# ls -l ./uds_socket
srwxr-xr-x 1 root root 0 Dec 11 13:45 ./uds_socket

可见uds文件是socket类型。具体的linux文件类型有以下几种:

Linux的文件类型有以下几种:

文件类型 ls -l显示
普通文件 -
目录 d
符号链接 l
字符设备 c
块设备 b
套接字 s
命名管道 p

参考:

  • Python实例浅谈之九使用本地socket文件
  • Linux下的IPC-UNIX Domain Socket
  • pymotw3 unix domain socket

记得帮我点赞哦!

精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你需要的学习资料,还在等什么?快去关注下载吧!!!

念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。

听我说,进步多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

职场亮哥文章列表:更多文章

本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!

unix domain socket 浅析相关推荐

  1. Unix Domain Socket 域套接字实现

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

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

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

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

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

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

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

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

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

  6. Unix domain socket IPC

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

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

    简介 之前的文章我们讲到了Socket中的Stream Socket和Datagram Socket,和有连接的Stream Socket不同,Datagram Socket是无连接的.有连接的Str ...

  8. IPC编程C语言,4. UNIX Domain Socket IPC

    4. UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络so ...

  9. 【进程间通信】Unix domain socket (进程间通信)

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

最新文章

  1. Altium Designer PCB快速布局
  2. Cookie,Session的区别
  3. 138. 兔子与兔子【字符串哈希】
  4. streaming api_通过Spring Integration消费Twitter Streaming API
  5. FileZilla 安装配置参考
  6. mysql 统计本月的_MySql查询当天、本周、本月、本季度、本年的数据
  7. python数据驱动读取用例_Python3-unittest测试框架之DDT数据驱动
  8. Python语言介绍
  9. 计算机二级office题库文档,二级office题库
  10. 【AJAX 教程】JS 原生 AJAX 请求
  11. VS2017安装并配置VTK
  12. 苹果电子邮件怎么注册_LOL英雄联盟手游谷歌账号怎么注册 谷歌账号注册方法步骤教程介绍...
  13. 台湾java程序员工资水平_女程序员在台湾的工资比大陆低吗?
  14. 推荐一个易学预测、学术研讨、资源分享网站:龙腾易学网
  15. 性能课程笔记(五)性能分析思路[转载高楼]
  16. 从秋招看名堂,哪些大厂值得程序员去?
  17. Kik CEO Ted Livingston发博称要成为西方的微信?
  18. [论文阅读] Facial Expression Recognition Using Residual Masking Network
  19. 有什么软件可以测试近视的度数,在家怎样测试视力度数,手机微信视力检测
  20. 关于前端上传文件到后台,文件大小超出限制,导致上传失败的解决办法。

热门文章

  1. spring-cloud版本与兼容
  2. 教你使用QQ2013闪登功能
  3. 基于C++的文件加密解密(密码学课程设计)
  4. 2020年熔化焊接与热切割模拟考试系统及熔化焊接与热切割考试试题
  5. 京东数科 Mr.AI在未来生长
  6. 网页k线html5,Echarts-K线图的使用
  7. TS声明文件——declare module——.d.ts文件
  8. SpringBoot 日志总结
  9. php订单下单支付流程,小程序的下单与支付的业务流程
  10. Windows Server 2012补丁下载