libzmq
libzmq copied to clipboard
Router does not reject duplicate identity
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
- start a server (parameters: "s")
- start a client (parameters: "c T1")
- start a second client (parameters: "c T2")
- 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 I have the same issue. Did you manage to figure this out by any chance?
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.
Thank you for the quick reply. Might have to do the same. Strange that ZMQ_ROUTER_HANDOVER does not work.
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