[zeromq-dev] libevent kqueue doesn't work on fd returned from zmq_getsockopt()

Pritesh Acharya priteshacharya at gmail.com
Fri May 3 12:01:25 CEST 2013


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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20130503/fb2957c6/attachment.htm>


More information about the zeromq-dev mailing list