libevent如何触发回调

How libevent triggers callback

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

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

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

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

Is it possible to configure the libevent such that the read callback on server's side is triggered for each 4-byte message sent from the client?

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

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

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