libevent 中基于套接字的 bufferevent 是否不需要 bufferevent_flush?
Is bufferevent_flush not necessary for a socket-based bufferevent in libevent?
Currently (as of Libevent 2.0.5-beta), bufferevent_flush()
is only
implemented for some bufferevent types. In particular, socket-based
bufferevents don’t have it.
我测试了以下代码:
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 中的基于套接字的 bufferevent 不是必需的吗?如果是这样,libevent 如何决定何时发送 evbuffer 中的未决数据?
据推测,libevent 依赖于底层套接字实现的缓冲服务。
对于 TCP/IP,这涉及在 send
缓冲区已满时或在没有添加新数据后不久 (Nagle's algorithm) 发送任何缓冲数据,以发生者为准第一的。由于这种延迟通常只有几百毫秒,您可能没有注意到它。
是调用setsockopt
来禁用这个延迟(TCP_NODELAY
)并且libevent可能正在使用它,在这种情况下任何数据传递给 send
的信息会立即传输。您可能必须检查来源,看看他们是否真的在做(这很不寻常)。
Currently (as of Libevent 2.0.5-beta),
bufferevent_flush()
is only implemented for some bufferevent types. In particular, socket-based bufferevents don’t have it.
我测试了以下代码:
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 中的基于套接字的 bufferevent 不是必需的吗?如果是这样,libevent 如何决定何时发送 evbuffer 中的未决数据?
据推测,libevent 依赖于底层套接字实现的缓冲服务。
对于 TCP/IP,这涉及在 send
缓冲区已满时或在没有添加新数据后不久 (Nagle's algorithm) 发送任何缓冲数据,以发生者为准第一的。由于这种延迟通常只有几百毫秒,您可能没有注意到它。
是调用setsockopt
来禁用这个延迟(TCP_NODELAY
)并且libevent可能正在使用它,在这种情况下任何数据传递给 send
的信息会立即传输。您可能必须检查来源,看看他们是否真的在做(这很不寻常)。