[zeromq-dev] Debugging "No route to host" when sending over ROUTER

Greg Ward greg at gerg.ca
Tue Dec 17 19:49:24 CET 2013


On 17 December 2013, I said:
> Unfortunately, I'm getting lots of "No route to host" (EHOSTUNREACH)
> errors trying to send messages over a ROUTER socket.

I think I may have found my problem.

> The 0MQ layer doesn't expose 0MQ IDs to its clients. Instead, every
> node has a human-readable name which is included in every message.
> When the server *receives* a message over the ROUTER, it saves the 0MQ
> ID in a map:
> 
>     msg = self.sock_in.recv_multipart()
>     (zmq_id, source, cdata) = msg
>     if source not in self.zmq_id_map:
>         logger.debug('recv: setting zmq_id_map[%r] = %r', source, zmq_id)
>         self.zmq_id_map[source] = zmq_id

It's here: I need to update zmq_id_map on every single incoming
message, not just on messages from clients we have not seen before.
Apparently the 0MQ ID can change behind the scenes. This makes sense
if a client reconnects: new OS-level socket, new ID. I'm not sure if
that's what's happening every time, but it definitely *can* happen.

Anyways, now my code looks like

    msg = self.sock_in.recv_multipart()
    (zmq_id, source, cdata) = msg
    logger.debug('recv: setting zmq_id_map[%r] = %r', source, zmq_id)
    self.zmq_id_map[source] = zmq_id

and I'm no longer seeing "No route to host" errors from my server
process. So far. ;-)

       Greg



More information about the zeromq-dev mailing list