首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在libevent中,基于套接字的缓冲区事件不需要bufferevent_flush吗?

在libevent中,基于套接字的缓冲区事件不需要bufferevent_flush吗?
EN

Stack Overflow用户
提问于 2021-06-14 20:40:11
回答 1查看 89关注 0票数 0

来自书面文件

目前(Libevent2.0.5-beta版),bufferevent_flush()只为某些缓冲区类型实现。特别是,基于套接字的缓冲区事件没有它。

我测试了以下代码:

代码语言:javascript
运行
复制
auto output = ::bufferevent_get_output(bev);
::evbuffer_add(output, "hello", 5);
// ::bufferevent_flush(bev, EV_WRITE, BEV_FLUSH);

注意,我注释掉了最后一行::bufferevent_flush(bev, EV_WRITE, BEV_FLUSH);,但是数据仍然是立即发送的。

中基于套接字的缓冲区事件不需要 bufferevent_flush 吗?如果是的话,libevent如何决定何时在evbuffer中发送挂起的数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-14 23:51:33

据推测,libevent依赖底层套接字实现的缓冲服务。

对于TCP/IP,这涉及在send缓冲区已满或未添加新数据(纳格尔算法)后短时间内发送任何缓冲数据,以先发生者为准。由于这种延迟通常只有几百毫秒,所以您可能没有注意到。

有一个对setsockopt的调用来禁用此延迟(TCP_NODELAY),而且libevent可能正在使用该延迟,在这种情况下,传递给send的任何数据都会立即被传输。您可能需要检查源代码,以确定他们是否确实在这样做(这将是不寻常的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67976949

复制
相关文章

相似问题

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