libevent与socket使用事件方式进行编程的思路是:以zmq的订阅端为例子,订阅端与服务端的连接的fd(文件描述符)加入到libevent的监听队列中,并传入自己的回调函数。正常情况下,当有数据来的时候,libevent会调用用户传入的回调函数,在回调函数里面去将数据取出来即可。
下面需要解决二个问题:
1、如何取得zmq的socket值?
使用getsockopt函数获取。
zmq::socket_t subscribe;
int sock_fd = 0;
size_t len = sizeof(sock_fd);
subscribe.getsockopt(ZMQ_FD, &sock_fd, &len);
2、丢包问题?
当获得之后,按每秒一个包的情况下,能工作得很好,没有问题。但当你发送频率变得很高,每秒几千之后,则出现丢包情况。
分析原因:在于zmq低层采用的是边缘触发机制。当多个数据到达的时候,触发器只会触发一次。
两种机制的区别,大家可以看这篇blog里面说明的:https://funcptr.net/2012/09/10/zeromq---edge-triggered-notification/
解决方案:
当触发回调的时候,需要一次性把数据全部读完。不要只读一次,否则可能存在你多次数据到来的时候,只通知一次的情况。这样情况下,则会导致数据好像“丢失”了。
int zevent