zmq与libevent集成及丢包问题分析解决

本文探讨了libevent与zmq集成时遇到的丢包问题。在高频率发送数据时,由于zmq的边缘触发机制,可能导致数据丢失。解决方案是在回调函数中一次性读取所有数据,避免多次数据到来只触发一次通知的情况。
摘要由CSDN通过智能技术生成

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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值