[nanomsg] Re: accessing control IDs

  • From: zerotacg <zero@xxxxxxxxxxxxxxxx>
  • To: nanomsg@xxxxxxxxxxxxx
  • Date: Mon, 05 May 2014 23:32:32 +0200

try going with a raw REP socket [1] that should give you the control id
on the hdr part of the msg

[1]
https://github.com/nanomsg/nanomsg/blob/master/src/protocols/reqrep/xrep.c

On 05.05.2014 23:27, Drew Crawford wrote:
> I have a REP socket.  I’m trying to identify the channel (sender or
> forwarder) on which some message has arrived to the socket.  A
> transport-layer understanding of the sender is not required; any
> identifying value, such as an integer, is sufficient.  Consulting
> the REQREP spec
> <https://raw.githubusercontent.com/nanomsg/nanomsg/master/rfc/sp-request-reply-01.txt>
>  
> suggests that the topmost “channel ID”, one of the records in the
> “backtrace”, is the identifier I’m looking for.
> 
> Clearly this identifier is not exposed over the nn_recv interface.  I
> had some hopes that it would be accessible in the nn_recvmsg interface,
> possibly as control information, but it seems not to be the case:
> 
>>     int client = nn_socket(AF_SP,NN_REQ);
>>     int server = nn_socket(AF_SP,NN_REP);
>>     nn_connect(client,"inproc://test");
>>     nn_bind(server,"inproc://test");
>>     nn_send(client,"A",1,0);
>>     
>>     int rc;
>>     void *body;
>>     void *control;
>>     struct nn_iovec iov;
>>     struct nn_msghdr hdr;
>>
>>     iov.iov_base = &body;
>>     iov.iov_len = NN_MSG;
>>     memset (&hdr, 0, sizeof (hdr));
>>     hdr.msg_iov = &iov;
>>     hdr.msg_iovlen = 1;
>>     hdr.msg_control = &control;
>>     hdr.msg_controllen = NN_MSG;
>>     rc = nn_recvmsg (server, &hdr, 0);
>>     print_array(body,rc,"body”); //contains only A
>>
>>     printf("msg_iovlen %d\n",hdr.msg_iovlen); //1
>>     printf("msg_controllen %d\n",hdr.msg_controllen); //-1
> 
> I have consulted a previous mailing thread on this topic
> <http://www.freelists.org/post/nanomsg/Where-Channel-ID-are-managed-in-the-code>
>  which
> suggests channel IDs are manipulated in rep.c.  Indeed, the information
> I’m looking for seems to be moved around between nn_sockbase, nn_msg,
> nn_rep, and similar structures.  However I cannot work out a sane way to
> get those structures from application code.  
> 
> Any suggestions on identifying the sender of a remote message?
> 
> Drew


Other related posts: