technical-point-about-zeromq-with-libuv
libuv
去监听zeromq
的fd
的关键技术点
ZeroMQ fd
zmq::socket_t *zmq_skt
可以用zmq_skt->get(zmq::sockopt::fd)
获取fd
。
zeromq
的fd
默认是边缘触发的,而不是水平触发的,这个要注意。
获取到的fd
可以交给libuv
的uv_poll_start
接口去监听。
监听后会触发回调函数,回调函数内部需要首先判断ZMQ_EVENTS
,也就是zmq_skt->get(zmq::sockopt::events)
。
判断是不是ZMQ_POLLIN
,是的话才可以进行recv
收包。回调函数内还需要加个循环判断,只要是ZMQ_POLLIN
就recv
,直到没有ZMQ_POLLIN
了才可退出回调函数。
例如n
个push
消息同一时间发送,而回调只触发一次,此时接收队列内部有n
个消息,就得同时调用n
次zmq_skt->get(zmq::sockopt::events)
,否则有一次不调用都会导致后续的消息不再触发。