• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

python 搞代码 3年前 (2022-02-20) 18次浏览 已收录 0个评论
文章目录[隐藏]

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

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

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

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:unix-domain-socket-浅析

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址