首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libevent如何触发回调

libevent如何触发回调
EN

Stack Overflow用户
提问于 2015-07-27 17:27:37
回答 1查看 864关注 0票数 2

我想知道libevent是如何触发回调的。例如,假设客户端重复发送4字节消息。在服务器端,似乎不是每个4字节的发送都会触发一个读取回调。例如,我发现回调有时是在接收到8字节消息(或其他数字)时触发的。是否可以配置libevent,以便为从客户端发送的每一条4字节消息触发服务器端的读回调?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-27 18:51:55

我相信你的问题是发送,而不是接收。由于输出缓冲,Libevent可能没有立即发送数据,因此只有当客户端真正收到所发送的数据时,才会调用read回调。

纳格尔算法 (又名TCP_NODELAY)。然后试着禁用它,看看是否真的是这样:

代码语言:javascript
复制
int flag = 1;
int ret = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));

是否可以配置libevent,以便为从客户端发送的每一条4字节消息触发服务器端的读回调?

不怎么有意思。您可以“同时”接收多条消息,因为TCP是一种面向流的协议。您的应用程序唯一关心的是知道每条消息从何处开始和结束。

不考虑为了解释的目的,你通常会:

  1. 继续循环调用recv
  2. 将接收到的数据/有效载荷附加到缓冲区;
  3. 调用一个方法来处理该缓冲区;
  4. process方法检查缓冲区大小,以确定它是否包含至少1条完整消息。在您的情况下,您希望它至少是4个字节,因此您知道至少有一个完整的消息要处理。如果缓冲区的大小不是4个字节的倍数(在负载非常小的情况下,这种情况永远不会发生),比如10个字节,则处理初始的4个字节,从缓冲区中删除它们,再次重复,然后将其余的2个字节保留在缓冲区中。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31659490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档