我对这一切都很陌生,但是 .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 语言。
您不能将
(host, port)
元组与 AF_UNIX
套接字一起使用。就像您在问题中提供的文档所说:
UNIX 域套接字的名称空间由路径名组成。当套接字程序调用bind() API 时,会在文件系统目录中创建一个条目。如果路径名已经存在,则bind()失败。
Unix 域套接字绑定到文件系统路径。您不需要预先创建任何内容(好吧,我猜您需要确保创建套接字的目录存在),但完成后您确实需要删除套接字。