unix域套接字Unix域套接字是在同一主机的进程间通信(IPC:Inter-ProcessCommunication)套接字架构上开发的,不需要经过网络协议栈,并且不需要打包解包、计算校验和、维护序列号和响应等,只需将应用层数据从一个进程复制到另一个进程即可。UNIXDomainSocket有两种工作模式:SOCK_DGRAM或SOCK_STREAM,类似于UDP和TCP,但是面向消息的UNIXDomainSocket也是可靠的,消息既不会丢失也不会乱序。UNIXDomainSocket可以用于两个不相关的进程,是全双工的,是目前应用最广泛的IPC机制。例如,XWindow服务器和GUI程序之间的通信是通过UNIX域套接字进行的。UNIX域套接字类似于网络套接字,可以和网络套接字对比使用。上面两者的编程区别如下:addressfamily是AF_UNIX因为是应用于IPC,所以UNIXDomainsocket不需要IP和port,而是用文件路径来表示“网络地址”。这体现在以下两个方面。地址格式不同。UNIXDomain套接字由结构体sockaddr_un表示,它是一个套接字类型文件在文件系统中的路径。这个套接字文件是通过调用bind()创建的。如果调用bind()时文件已经存在,则bind()错误返回。UNIXDomainSocket客户端一般需要显式调用bind函数,而不是像网络socket一样依赖系统自动分配的地址。clientbind的socket文件名可以包含client的pid,这样server可以区分不同的client。下面使用python代码演示uds的使用Python代码演示服务端#!/usr/bin/envpython#-*-coding:utf-8-*-"""Createdon12/11/1711:55AM@author:ChenLiang@function:socket_echo_server_uds"""importsysreload(sys)sys.setdefaultencoding('utf-8')importsocketimportosserver_address='./uds_socket'#确保套接字没有existtry:os.unlink(server_address)exceptOSError:ifos.path.exists(server_address):raise#创建UDSsocketsock=socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)#将socket绑定到地址print('startingupon{}'.format(server_address))sock.bind(server_address)#侦听传入连接sock.listen(1)whileTrue:#等待连接print('waitingforaconnection')connection,client_address=sock.accept()try:print('connectionfrom',client_address)#接收小块数据并重新传输whileTrue:data=connection.recv(16)print('received{!r}'.format(data))ifdata:print('sendingdatabacktoclient')connection.sendall(data)else:print('nodatafrom',client_address)breakfinally:#清理连接connection.close()客户端#!/usr/bin/envpython#-*-coding:utf-8-*-"""Createdon12/11/1711:55AM@author:陈亮@function:socket_echo_client_uds"""importsysreload(sys)sys.setdefaultencoding('utf-8')importsocketimportsys#创建UDSsocketsock=socket.socket(family=socket.AF_UNIX,type=socket.SOCK_STREAM)#将套接字连接到服务器正在监听的端口server_address='./uds_socket'print('connectingto{}'.format(server_address))try:sock.connect(server_address)exceptsocket.errorasmsg:print(msg)sys.exit(1)try:#发送数据message=b'Thisisthemessage.它将被重复。print('发送{!r}'.format(mes圣人))sock.sendall(消息)amount_received=0amount_expected=len(message)whileamount_received
