technical-point-about-zeromq-with-libuv

libuv去监听zeromqfd的关键技术点

ZeroMQ fd

zmq::socket_t *zmq_skt

可以用zmq_skt->get(zmq::sockopt::fd)获取fd

zeromqfd默认是边缘触发的,而不是水平触发的,这个要注意。

获取到的fd可以交给libuvuv_poll_start接口去监听。

监听后会触发回调函数,回调函数内部需要首先判断ZMQ_EVENTS,也就是zmq_skt->get(zmq::sockopt::events)

判断是不是ZMQ_POLLIN,是的话才可以进行recv收包。回调函数内还需要加个循环判断,只要是ZMQ_POLLINrecv,直到没有ZMQ_POLLIN了才可退出回调函数。

例如npush消息同一时间发送,而回调只触发一次,此时接收队列内部有n个消息,就得同时调用nzmq_skt->get(zmq::sockopt::events),否则有一次不调用都会导致后续的消息不再触发。

githubgithub.com/zeromq/libzmq/issues/1434
funcptrfuncptr.net/2013/04/20/embedding-zeromq-in-the-libev-event-loop