来自书面文件
目前(Libevent2.0.5-beta版),
bufferevent_flush()
只为某些缓冲区类型实现。特别是,基于套接字的缓冲区事件没有它。
我测试了以下代码:
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中发送挂起的数据?
发布于 2021-06-14 23:51:33
据推测,libevent依赖底层套接字实现的缓冲服务。
对于TCP/IP,这涉及在send
缓冲区已满或未添加新数据(纳格尔算法)后短时间内发送任何缓冲数据,以先发生者为准。由于这种延迟通常只有几百毫秒,所以您可能没有注意到。
有一个对setsockopt
的调用来禁用此延迟(TCP_NODELAY
),而且libevent可能正在使用该延迟,在这种情况下,传递给send
的任何数据都会立即被传输。您可能需要检查源代码,以确定他们是否确实在这样做(这将是不寻常的)。
https://stackoverflow.com/questions/67976949
复制相似问题