You have to use AF_SP_RAW sockets to get access to these info in the control header when receiving a message with nn_recvmsg. On May 5, 2014, at 2:27 PM, Drew Crawford <drew@xxxxxxxxxxxxxxxxxx> 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 > 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 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