libzmq icon indicating copy to clipboard operation
libzmq copied to clipboard

Router does not reject duplicate identity

Open BenediktBurger opened this issue 2 years ago • 6 comments

Issue description

If I set the same identity to two sockets (DEALER) and connect them to one ROUTER socket, the first connected DEALER works fine, while the other one does connect, but no message arrives at the ROUTER socket. According to the manual, the second connection should be refused:

"If two clients use the same routing id when connecting to a ROUTER, the results shall depend on the ZMQ_ROUTER_HANDOVER option setting. If that is not set (or set to the default of zero), the ROUTER socket shall reject clients trying to connect with an already-used routing id."

However no error message is raised.

See also #2010

Environment

  • libzmq version (commit hash if unreleased): 4.3.4
  • OS:

Minimal test code / Steps to reproduce the issue

You can use https://github.com/zeromq/pyzmq/issues/1646

  1. start a server (parameters: "s")
  2. start a client (parameters: "c T1")
  3. start a second client (parameters: "c T2")
  4. send a message via second client and it hangs

What's the actual result? (include assertion message & call stack if applicable)

Message of second client does not arrive.

What's the expected result?

An error message, that the second client cannot connect.

BenediktBurger avatar Jan 31 '23 15:01 BenediktBurger

@BenediktBurger I have the same issue. Did you manage to figure this out by any chance?

evojkollar avatar Jun 06 '24 19:06 evojkollar

In LECO (and the python implementation PyLECO), we use the default random ids. Instead, the clients inform the server about their name (via json rpc encoded message). From that moment on, the server connects the ID and the name, such that it can route messages based on names.

So no, I did not solve this problem, but wrote an alternative.

BenediktBurger avatar Jun 06 '24 19:06 BenediktBurger

Thank you for the quick reply. Might have to do the same. Strange that ZMQ_ROUTER_HANDOVER does not work.

evojkollar avatar Jun 06 '24 20:06 evojkollar

Maybe it's relevant for you: Here is our protocol definition: https://github.com/pymeasure/leco-protocol and here is the python implementation of that protocol definition: https://github.com/pymeasure/pyleco

BenediktBurger avatar Jun 07 '24 09:06 BenediktBurger