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的应用
<!–more–>
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 sys reload(sys) sys.setdefaultencoding('utf-8') import socket import os server_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 connection print('waiting for a connection') connection, client_address = sock.accept() try: print('connection from', client_address) # Receive the data in small chunks and retransmit it while 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) break finally: # Clean up the connection connection.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 sys reload(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 data message = b'This is the message. It will be repeated.' print('sending {!r}'.format(message)) sock.sendall(message) amount_received = 0 amount_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高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。
听我说,提高多,程序人生一把梭
如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。
职场亮哥文章列表:更多文章
自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!