在 Python 中使用 AF_UNIX 和 SOCK_SEQPACKET 时,.bind() 的地址参数应该是什么?

问题描述 投票:0回答:1

我对这一切都很陌生,但是 .bind() 所需的参数或“类似字节的对象”是什么?我在 2007 年的这个网站上读到“.bind() 和 .connect() 的地址参数是 Unix 套接字文件的路径”:https://utcc.utoronto.ca/~cks/space/blog/ python/UnixDomainSockets

我还读过这篇文章: “创建套接字描述符后,bind() API 会获取套接字的唯一名称。 UNIX 域套接字的命名空间由路径名组成。当套接字程序调用bind() API 时,会在文件系统目录中创建一个条目。如果路径名已经存在,则 bind() 失败。因此,UNIX 域套接字程序应始终调用 unlink() API 以在结束时删除目录项。” https://www.ibm.com/docs/en/i/7.3?topic=families-using-af-unix-address-family

但是我仍然找不到有关如何创建此路径的实际语法,或者我是否需要更改权限以在我的目录中创建此文件?

这是 server.py 的开始片段:

import socket

host = "127.0.0.1"
port = 5006

with socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) as s:
    s.bind((host, port))
    
    print(f"Starting server on {host}, port{port}")
    s.listen()
    conn, addr = s.accept()

这是 client.py 的开始片段:

import socket

host = "127.0.0.1"
port = 5006
with socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) as s:
    s.connect((host,port))

当我在 WSL 中运行它时,出现此错误:

s.bind((主机,端口)) 类型错误:需要类似字节的对象,而不是“元组”

基本上,我最初使用 SOCK_STREAM 和 AF_INET 开始这个项目并让它工作;但现在我想使用SOCK_SEQPACKET,所以我必须使用AF_UNIX。元组(主机,端口)是 AF_INET 的遗留物,但我不知道用什么替换它,并且在线示例代码是 C 语言,而不是 Python 语言。

python sockets network-programming unix bind
1个回答
0
投票

您不能将

(host, port)
元组与
AF_UNIX
套接字一起使用。就像您在问题中提供的文档所说:

UNIX 域套接字的名称空间由路径名组成。当套接字程序调用bind() API 时,会在文件系统目录中创建一个条目。如果路径名已经存在,则bind()失败。

Unix 域套接字绑定到文件系统路径。您不需要预先创建任何内容(好吧,我猜您需要确保创建套接字的目录存在),但完成后您确实需要删除套接字。

© www.soinside.com 2019 - 2024. All rights reserved.