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

Popular posts from this blog

php - Why I am getting the Error "Commands out of sync; you can't run this command now" -

linux - Does gcc have any options to add version info in ELF binary file? -

java - Are there any classes that implement javax.persistence.Parameter<T>? -