关于python:unix-domain-socket-浅析

7次阅读

共计 3630 个字符,预计需要花费 10 分钟才能阅读完成。

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 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。

听我说,提高多,程序人生一把梭

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

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

自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!

正文完
 0