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

Question:

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

If I do the following code, no error is shown :

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")

But, if I try to use the function zmq_getsockopt(), it fails :

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)

Then I get :

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

Asked By: mar_p

||

Answers:

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

Well, you will be way, way better off, if you start with first understanding The Rules of the Game, than with learning from crashes ( yes, on the very contrary to what "wannabe-evangelisation-gurus" pump into the crowds that "just-coding" is enough – which it is not, for doing indeed a serious business ).

This is why:

If you read the published API, it still will confuse you most of the time, if you have no picture of the structure of the system & do not understand its internal and external behaviours ( the Framework’s Rules of the Game ) :

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).

This says the point, yet without knowing the concept, the point is still hidden from you to see it.


The Best Next Step

If you are indeed serious into low-latency and distributed computing, the best next step, after reading the link above, is to stop coding and first take some time to read and understand the fabulous Pieter Hintjens’ book "Code Connected, Volume 1" before going any further – definitely worth your time.

Then, you will see why this will never fly:

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 )

whereas this one may ( yet no handling of a NULL-terminated character string is still present here … which is per se a sign of a bad software design ) :

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 )
Answered By: user3666197
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.