根据以下代码,我构建了一个echo服务器版本,但是有一个线程延迟。这是因为我注意到在初始连接时,我的第一个发送被发送回客户端,但客户端直到第二次发送才收到它。我的实际用例是我需要向服务器发送消息,进行大量处理,然后将结果发回...比如10-30秒后(在某些情况下可能是几小时)。
http://www.wangafu.net/~nickm/libevent-book/Ref8_listener.html
所以这是我的代码。为了简洁起见,我只包含了与libevent相关的代码;不是线程代码或其他东西。调试时,建立新连接,正确填充字符串缓冲区,调试显示写入成功。
但是我只接收来自前一次发送的回声。我从客户端发送数字来验证这一点,当我从客户端发送1时,我通过echo从服务器收到任何内容......即使服务器肯定是使用evbuffer_add写入缓冲区(我也尝试使用bufferevent_write_buffer )。
当我发送2时,从客户端,然后我收到上一次发送的1。这就像我的写入被缓存....我已经关闭了nagle。
所以,我的问题是:libevent cache是否使用以下方法发送?
evbuffer_add(outputBuffer,buffer,length);
有没有办法刷新这个缓存?是否有其他方法将缓存标记为已完成或完成?我可以强制发送吗?它永远不会发送它自己...我甚至延迟了。用“send”替换evbuffer_add每次都能很好地工作。
答案 0 :(得分:1)
最有可能受Nagle algorithm影响 - 基本上它会在将传出数据发送到网络之前对其进行缓冲。看一下这篇文章:TCP/IP options for high-performance data transmission。
以下是如何禁用缓冲的示例:
int flag = 1;
int result = setsockopt(sock, /* socket affected */
IPPROTO_TCP, /* set option at TCP level */
TCP_NODELAY, /* name of option */
(char *) &flag, /* the cast is historical
cruft */
sizeof(int)); /* length of option value */