【问题标题】:Is bufferevent_flush not necessary for a socket-based bufferevent in libevent?libevent中基于套接字的bufferevent不需要bufferevent_flush吗?
【发布时间】:2021-08-30 18:07:28
【问题描述】:

来自documentation of libevent

目前(截至 Libevent 2.0.5-beta),bufferevent_flush() 仅 为一些缓冲事件类型实现。 尤其是基于套接字的 bufferevents 没有。

我测试了以下代码:

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 中基于套接字的缓冲事件不是必需的?如果是这样,libevent 如何决定何时发送 evbuffer 中的待处理数据?

【问题讨论】:

    标签: c asynchronous networking network-programming libevent


    【解决方案1】:

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

    对于 TCP/IP,这涉及在 send 缓冲区已满时或在没有添加新数据 (Nagle's algorithm) 后不久发送任何缓冲数据,以先发生者为准。由于这种延迟通常只有几百毫秒,您可能没有注意到。

    调用setsockopt 以禁用此延迟(TCP_NODELAY),libevent 可能正在使用该延迟,在这种情况下,传递给send 的任何数据都会立即传输。您可能必须检查来源,看看他们是否真的在做(这很不寻常)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2012-04-01
      • 2021-01-15
      • 1970-01-01
      • 2012-03-26
      • 2011-12-09
      相关资源
      最近更新 更多