【问题标题】:Libevent does not echo properly when there is a delay有延迟时,Libevent 无法正确回显
【发布时间】:2013-11-18 18:43:54
【问题描述】:

基于以下代码,我构建了一个回显服务器版本,但具有线程延迟。这是因为我注意到在初始连接时,我的第一次发送被发送回客户端,但客户端直到第二次发送才收到它。我的实际用例是我需要向服务器发送消息,进行大量处理,然后将结果发回......比如说 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 缓存是否使用以下方法发送?

evbuffer_add(outputBuffer, 缓冲区, 长度);

有没有办法刷新这个缓存?是否有其他方法可以将缓存标记为已完成或已完成?我可以强制发送吗?它从不自行发送...我什至延迟了。每次将 evbuffer_add 替换为“send”都能完美运行。

【问题讨论】:

    标签: caching network-programming libevent


    【解决方案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 */
    

    【讨论】:

    • 是的,我试过了。事实证明,线程是个大问题。在创建 libevent 之前,将以下内容添加到我的 main 顶部,一切正常。 evthread_use_windows_threads(); (Linux 的 pthread)
    猜你喜欢
    • 2021-08-29
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多