libevent如何触发回调

时间:2015-07-27 17:27:37

标签: c sockets libevent

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

无视解释的目的,通常是:

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