当有延迟时,Libevent不能正确回应

时间:2013-11-18 18:43:54

标签: caching network-programming libevent

根据以下代码,我构建了一个echo服务器版本,但是有一个线程延迟。这是因为我注意到在初始连接时,我的第一个发送被发送回客户端,但客户端直到第二次发送才收到它。我的实际用例是我需要向服务器发送消息,进行大量处理,然后将结果发回...比如10-30秒后(在某些情况下可能是几小时)。

http://www.wangafu.net/~nickm/libevent-book/Ref8_listener.html

所以这是我的代码。为了简洁起见,我只包含了与libevent相关的代码;不是线程代码或其他东西。调试时,建立新连接,正确填充字符串缓冲区,调试显示写入成功。

http://pastebin.com/g02S2RTi

但是我只接收来自前一次发送的回声。我从客户端发送数字来验证这一点,当我从客户端发送1时,我通过echo从服务器收到任何内容......即使服务器肯定是使用evbuffer_add写入缓冲区(我也尝试使用bufferevent_write_buffer )。

当我发送2时,从客户端,然后我收到上一次发送的1。这就像我的写入被缓存....我已经关闭了nagle。

所以,我的问题是:libevent cache是​​否使用以下方法发送?

evbuffer_add(outputBuffer,buffer,length);

有没有办法刷新这个缓存?是否有其他方法将缓存标记为已完成或完成?我可以强制发送吗?它永远不会发送它自己...我甚至延迟了。用“send”替换evbuffer_add每次都能很好地工作。

1 个答案:

答案 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 */