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),否则有一次不调用都会导致后续的消息不再触发。