[zeromq-dev] zeromq-dev Digest, Vol 65, Issue 4

Pritesh Acharya priteshacharya at gmail.com
Wed May 8 20:03:58 CEST 2013


I tried ZMQ_EVENTS, it worked but not completely. I am only able to receive
few message and then the callback never hits.
I'm calling zmq_getsockopt with ZMQ_EVENTS twice. before zmq_recv and
after. Here is the complete code snippet of callback.

static char * zmq_msg_recv_all(evutil_socket_t fd, short event, void
*receiver)
{
char *msg = NULL;

    unsigned int     zmq_events;
    size_t           zmq_events_size  = sizeof(zmq_events);
zmq_getsockopt (receiver, ZMQ_EVENTS, &zmq_events, &zmq_events_size);

if (zmq_events & ZMQ_POLLIN)
{
msg=calloc(1024,sizeof(char));
int size = zmq_recv (receiver, msg, 255, ZMQ_DONTWAIT);

if (size != -1) {
#ifdef DEBUG
printf("msg = %s\n",msg);
#endif
}
else
{
free(msg);
msg=NULL;
}
zmq_getsockopt (receiver, ZMQ_EVENTS, &zmq_events, &zmq_events_size);
}
return msg;
}

>
> you need to read the man page about ZMQ_FD and ZMQ_EVENTS
>
> http://api.zeromq.org/3-2:zmq-getsockopt
>
> in short, once ZMQ_FD is readable you need to look at ZMQ_EVENTS and
> consume all messages
> until ZMQ_EVENTS is clear
>
> jon
>
>
>
> On 3 May 2013 11:01, Pritesh Acharya <priteshacharya at gmail.com> wrote:
>
> > I'm writing a service in C programming using libevent and zmq. Msg is
> > pushed from python code to C service using PUSH-PULL pattern.
> >
> > fd received from zmq socket:
> >
> > void *receiver = zmq_socket (base.zmq_ctx, ZMQ_PULL);
> > zmq_connect (receiver, "tcp://localhost:5557");int fd=0;size_t fd_len =
> sizeof(fd);
> > zmq_getsockopt (receiver, ZMQ_FD, &fd, &fd_len);
> >
> >  Using Libevent, event registered with fd for persistent read
> >
> > struct event *read_data_on_zmq =event_new(base.evbase, fd, EV_READ |
> EV_PERSIST , read_data_on_zmq_cb,receiver);
> > event_add(read_data_on_zmq,NULL);
> > event_base_dispatch(base.evbase);
> >
> >  On the callback method I'm doing a non-blocking receive
> >
> > void read_data_on_zmq_cb(evutil_socket_t fd, short what, void *arg){
> >     char *msg = calloc(1024,sizeof(char));
> >     int size = zmq_recv (receiver, msg, 255, ZMQ_DONTWAIT);
> >     if (size != -1)
> >     {
> >         puts ("is size is not -1");
> >         printf("msg = %s\n",msg);
> >     }}
> >
> > In the python code I'm continuously sending message to the socket.
> >
> > import zmqimport time
> >
> > c=zmq.Context()
> > s=c.socket(zmq.PUSH)
> > s.bind('tcp://127.0.0.1:5557')while(True):
> >     s.send("abc")
> >     time.sleep(2)
> >
> >  The problem is I'm only able to receive the message once, after that the
> > event callback never gets hit. If I do zmq_connect inside the
> > read_data_on_zmq_cb after zmq_recv, then it works fine, but I guess that
> is
> > redundant and not the correct way to do it. What is the problem here?
> >
> > _______________________________________________
> > zeromq-dev mailing list
> > zeromq-dev at lists.zeromq.org
> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev
> >
> >
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL:
> http://lists.zeromq.org/pipermail/zeromq-dev/attachments/20130503/9444f03d/attachment-0001.htm
>
> ------------------------------
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20130508/d03faa98/attachment.htm>


More information about the zeromq-dev mailing list