[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[Libevent-users] libevent kqueue not working properly on fd returned from zmq_getsockopt()



This problem is also related to zmq. 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); 
    }
    zmq_getsockopt (receiver, ZMQ_EVENTS, &fd, &fd_size);

}

In the python code I'm continuously sending message to the socket.

import zmq
import 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 few time, after that the event callback never gets hit. And the msg from python gets lost. What is the problem here?