【问题标题】:How libevent triggers callbacklibevent 如何触发回调
【发布时间】:2015-10-18 00:23:27
【问题描述】:

我想知道 libevent 如何触发回调。例如,假设客户端重复发送一条 4 字节的消息。在服务器端,似乎不是每个 4 字节发送都会触发读取回调。例如,我发现回调有时会在接收到 8 字节消息(或其他数字)时触发。是否可以配置 libevent 以使客户端发送的每条 4 字节消息都触发服务器端的读取回调?

【问题讨论】:

    标签: c sockets libevent


    【解决方案1】:

    我相信您的问题是关于发送,而不是关于接收。由于输出缓冲,Libevent 可能不会立即发送您的数据,因此您的read 回调仅在客户端真正收到您发送的数据时才会调用。 p>

    见 Nagle's algorithm(又名TCP_NODELAY)。然后尝试禁用它,看看是否真的如此:

    int flag = 1;
    int ret = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
    

    是否可以配置libevent,以便客户端发送的每条4字节消息都会触发服务器端的读取回调?

    不是真的。由于 TCP 是面向流的协议,您可能会“同时”接收到多条消息。您的应用程序唯一关心的是知道每条消息的开始和结束位置。

    出于解释的目的而忽略 libevent,您通常会:

    1. 循环调用recv;
    2. 将接收到的数据/有效负载附加到缓冲区;
    3. 调用方法来处理该缓冲区;
    4. process 方法检查缓冲区大小以查看它是否包含至少 1 条完整消息。在您的情况下,您希望它至少为 4 个字节,因此您知道您至少有 1 条完整的消息要处理。如果您的缓冲区的大小不是 4 字节的倍数(考虑到您的有效负载非常小,这种情况永远不会发生),例如 10 个字节,您处理最初的 4 个字节,将它们从缓冲区中删除,再次重复,然后然后将剩余的 2 个字节保留在缓冲区中。

    【讨论】:

    • 我明白了。服务器是否可以接收大小不是 4 的倍数的消息?
    • 记住你的有效载荷正好是 4 字节长,那么答案是否定的,但我当然不建议依赖这个。您最好使用一种机制来存储接收到的数据(请参阅bufferevent's),然后再对其进行处理。如果您检测到您没有收到完整的消息,那么您应该等待更多。
    • 谢谢!这样就说得通了。
    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多