[zeromq-dev] Can I make a ROUTER ignore a client's ZMQ_IDENTITY?
Pieter Hintjens
ph at imatix.com
Wed Jan 1 13:03:16 CET 2014
Indeed, I've reproduced this. Seems the second duplicate identity is
rejected. This is a change of behavior. I'll investigate... thanks for
reporting it.
On Sat, Dec 28, 2013 at 10:40 AM, Tom Nakamura <tnakamura at eml.cc> wrote:
>
>
> On Sat, Dec 28, 2013, at 12:02 AM, Pieter Hintjens wrote:
>> On Sat, Dec 28, 2013 at 12:32 AM, Tom Nakamura <tnakamura at eml.cc> wrote:
>>
>> If I expose
>> > a ROUTER socket to unknown/untrusted clients, then the router may get
>> > multiple connections with the same identity by accident or malice
>> > resulting in a denial of service. Or am I missing something in the way
>> > routers work?
>>
>> You can't ignore identities. However duplicate clients with the same
>> ID will be treated as anonymous (their ID will be ignored) so there is
>> no risk of a denial of service. You can switch off that behavior using
>> ZMQ_ROUTER_HANDOVER, which lets clients "steal" connections by
>> specifying an already-used ID.
>>
>> -Pieter
>
> Wait, so what am I doing wrong below? I create two detached threads
> which creates a DEALER socket (same thing happens with REQ but DEALER
> makes it shorter) that sends a message every second (and printf()s a
> debug message, see code), and receives those messages on a ROUTER in the
> main thread and calls zmsg_dump().
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <assert.h>
> #include <zmq.h>
> #include <czmq.h>
>
> // connection point does not seem to make a difference
> //#define ENDPOINT "tcp://127.0.0.1:8888"
> #define ENDPOINT "ipc://myipc.ipc"
>
> void * client_thread(void * args){
> zctx_t * context = zctx_new();
> void * client = zsocket_new (context, ZMQ_DEALER);
>
> zsocket_set_identity(client, "CUSTOMID");
>
> int rc = zsocket_connect(client, ENDPOINT); assert(rc != -1);
>
> while (! zctx_interrupted){
> // i'm just using the context address as an id to
> // differentiate the two client's printfs
> printf("> %p sent msg\n", context);
> zstr_send(client, "SOMEMSG");
> zclock_sleep(1000);
> }
>
> zsocket_destroy(context, client);
> zctx_destroy(&context);
> return NULL;
> }
>
> int main(int argc, char * argv[]) {
> int rc;
>
> rc = zthread_new (client_thread, NULL); assert(rc == 0);
> rc = zthread_new (client_thread, NULL); assert(rc == 0);
>
> zctx_t * context = zctx_new();
> assert(context);
>
> void * server = zsocket_new (context, ZMQ_ROUTER);
> assert(server);
>
> rc = zsocket_bind(server, ENDPOINT); assert(rc != -1);
>
> while (!zctx_interrupted){
> zmsg_t * msg = zmsg_recv(server);
> if (!msg)
> break;
> zmsg_dump(msg);
> }
>
> zsocket_destroy(context, server);
> zctx_destroy(&context);
>
> return 0;
> }
>
> By setting the client identity, I only get one reply for each time the
> clients both send a message:
>
> > 0x7f77380008c0 sent msg
> > 0x7f77300008c0 sent msg
> --------------------------------------
> [008] CUSTOMID
> [007] SOMEMSG
> > 0x7f77380008c0 sent msg
> > 0x7f77300008c0 sent msg
> --------------------------------------
> [008] CUSTOMID
> [007] SOMEMSG
> > 0x7f77380008c0 sent msg
> > 0x7f77300008c0 sent msg
> --------------------------------------
> [008] CUSTOMID
> [007] SOMEMSG
>
> But if I comment out the zsocket_set_identity() call, I get what one
> would expect (a response to each):
>
> > 0x7f44e80008c0 sent msg
> > 0x7f44e00008c0 sent msg
> --------------------------------------
> [005] 006B8B4567
> [007] SOMEMSG
> --------------------------------------
> [005] 006B8B4568
> [007] SOMEMSG
> > 0x7f44e00008c0 sent msg
> > 0x7f44e80008c0 sent msg
> --------------------------------------
> [005] 006B8B4568
> [007] SOMEMSG
> --------------------------------------
> [005] 006B8B4567
> [007] SOMEMSG
> > 0x7f44e80008c0 sent msg
> > 0x7f44e00008c0 sent msg
> --------------------------------------
> [005] 006B8B4567
> [007] SOMEMSG
> --------------------------------------
> [005] 006B8B4568
> [007] SOMEMSG
>
> I am using zeromq 4.0.3 and czmq 2.0.3 on Linux Mint 15 64 bit.
> Thank you,
> Tom
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
More information about the zeromq-dev
mailing list