c - libevent kqueue doesn't work on fd returned from zmq_getsockopt() -
original post: i'm writing service in c programming using libevent , zmq. msg pushed python code c service using push-pull pattern.
fd received 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 fd 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 callback method i'm doing 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 not -1"); printf("msg = %s\n",msg); } } in python code i'm continuously sending message 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 i'm able receive message once, after event callback never gets hit. if zmq_connect inside read_data_on_zmq_cb after zmq_recv, works fine, guess redundant , not correct way it. problem here?
edit1: in addition checking zmq_events after doing zmq_recv(), need fetch message because zmq edge triggered. great explanation edge trigered notification here http://funcptr.net/2012/09/10/zeromq---edge-triggered-notification/ event callback
void read_data_on_zmq_cb(evutil_socket_t fd, short what, void *arg) { unsigned int zmq_events; size_t zmq_events_size = sizeof(zmq_events); char *msg=null; zmq_getsockopt (receiver, zmq_events, &zmq_events, &zmq_events_size); while(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 //return msg; } zmq_getsockopt (receiver, zmq_events, &zmq_events, &zmq_events_size); } }
please read edit1 complete answer code. problem was: didn't recheck zmq_events after doing zmq_recv(), state of socket changes @ time.
so calling
zmq_getsockopt (receiver, zmq_events, &fd, &fd_size); after zmq_recv() solved problem.
Comments
Post a Comment