unix domain socket 浅析
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 浅析相关推荐
- Unix Domain Socket 域套接字实现
主要注意流程: STREAM SOCKET: Server : socket() ---> bind() ---> listen() ---> accept() Client: ...
- UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信
文章目录 概述 流程介绍 概述 Linux下进程通讯方式有很多,比较典型的有套接字,平时比较常用的套接字是基于TCP/IP协议的,适用于两台不同主机上两个进程间通信, 通信之前需要指定IP地址. 但是 ...
- 网络协议之: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 简介(进程间通信,进程通信)
Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信.socket 原本是为网络通讯设 ...
- Unix domain socket IPC
UNIX Domain socket 虽然网络socket也可用于同一台主机的进程间通讯(通过lo地址127.0.0.1),但是unix domain socket用于IPC更有效率:不需要经过网络协 ...
- 网络协议之socket协议详解之Unix domain Socket
简介 之前的文章我们讲到了Socket中的Stream Socket和Datagram Socket,和有连接的Stream Socket不同,Datagram Socket是无连接的.有连接的Str ...
- IPC编程C语言,4. UNIX Domain Socket IPC
4. UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络so ...
- 【进程间通信】Unix domain socket (进程间通信)
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket. 虽然网络socket也可用于同一台主机的进程间通讯(通过loo ...
最新文章
- Altium Designer PCB快速布局
- Cookie,Session的区别
- 138. 兔子与兔子【字符串哈希】
- streaming api_通过Spring Integration消费Twitter Streaming API
- FileZilla 安装配置参考
- mysql 统计本月的_MySql查询当天、本周、本月、本季度、本年的数据
- python数据驱动读取用例_Python3-unittest测试框架之DDT数据驱动
- Python语言介绍
- 计算机二级office题库文档,二级office题库
- 【AJAX 教程】JS 原生 AJAX 请求
- VS2017安装并配置VTK
- 苹果电子邮件怎么注册_LOL英雄联盟手游谷歌账号怎么注册 谷歌账号注册方法步骤教程介绍...
- 台湾java程序员工资水平_女程序员在台湾的工资比大陆低吗?
- 推荐一个易学预测、学术研讨、资源分享网站:龙腾易学网
- 性能课程笔记(五)性能分析思路[转载高楼]
- 从秋招看名堂,哪些大厂值得程序员去?
- Kik CEO Ted Livingston发博称要成为西方的微信?
- [论文阅读] Facial Expression Recognition Using Residual Masking Network
- 有什么软件可以测试近视的度数,在家怎样测试视力度数,手机微信视力检测
- 关于前端上传文件到后台,文件大小超出限制,导致上传失败的解决办法。