zmq_getsockopt error : zmq.error.ZMQError: No such file or directory for ipc path

zmq_getsockopt error : zmq.error.ZMQError: No such file or directory for ipc path

我是 ZeroMQ 的新手,所以我正在为一些代码而苦苦挣扎。

如果我执行以下代码,则不会显示任何错误:

import zmq.asyncio
ctx = zmq.asyncio.Context()
rcv_socket = ctx.socket(zmq.PULL)

rcv_socket.connect("ipc:///tmp/test")

rcv_socket.bind("ipc:///tmp/test")

但是,如果我尝试使用函数 zmq_getsockopt(),它会失败:

import zmq.asyncio

ctx = zmq.asyncio.Context()
rcv_socket = ctx.socket(zmq.PULL)

rcv_socket.connect("ipc:///tmp/test")

socket_path = rcv_socket.getsockopt(zmq.LAST_ENDPOINT)

rcv_socket.bind("ipc://%s" % socket_path)

然后我得到:

zmq.error.ZMQError: No such file or directory for ipc path "b'ipc:///tmp/test'".

"...new to use ZeroMQ, so I am struggling with some code."

首先,欢迎来到零之禅的艺术。


如果你从未使用过 ZeroMQ,
你可能会喜欢先看看
,然后再深入了解更多细节



好吧,如果你首先了解 游戏规则,那么你会过得更好,而不是从崩溃中学习(是的,恰恰相反"wannabe-evangelisation-gurus" 向人群中注入的东西 "just-coding" 就足够了 - 但事实并非如此,因为它确实是一项严肃的业务)

这就是为什么:

如果你阅读已发布的API,如果你没有系统结构图&不了解其内部和外部行为(框架的游戏规则):

The ZMQ_LAST_ENDPOINT option shall retrieve the last endpoint bound for TCP and IPC transports. The returned value will be a string in the form of a ZMQ DSN. Note that if the TCP host is INADDR_ANY, indicated by a *, then the returned address will be 0.0.0.0 (for IPv4).

说到点子上了,不懂概念,点子还是藏不住的。


最好的下一步

如果您确实认真对待 ,最好的下一步是在阅读上面的 link 之后停止编码,先花一些时间阅读和理解精彩的 Pieter HINTJENS'书 "Code Connected, Volume 1" 确实是一本必读的文章,可以让你更进一步 - 绝对值得你所有的时间和努力。

然后,你会明白为什么这永远不会飞:

import zmq.asyncio; ctx = zmq.asyncio.Context()
rcv_socket        = ctx.socket( zmq.PULL )
rcv_socket.connect( "ipc:///tmp/test" )

socket_path = rcv_socket.getsockopt( zmq.LAST_ENDPOINT )

rcv_socket.bind(    "ipc://%s" % socket_path )

而这个可能(但是这里仍然没有处理以 NULL 结尾的字符 string ... 这本身就是一个糟糕的软件设计实践的标志 and/or 自纪律或两者兼而有之):

import zmq.asyncio; ctx = zmq.asyncio.Context()
rcv_socket        = ctx.socket( zmq.PULL )    
rcv_socket.bind(    "ipc:///tmp/test" )

socket_path = rcv_socket.getsockopt( zmq.LAST_ENDPOINT )

rcv_socket.connect( "ipc://%s" % socket_path )