【发布时间】:2015-10-18 00:23:27
【问题描述】:
我想知道 libevent 如何触发回调。例如,假设客户端重复发送一条 4 字节的消息。在服务器端,似乎不是每个 4 字节发送都会触发读取回调。例如,我发现回调有时会在接收到 8 字节消息(或其他数字)时触发。是否可以配置 libevent 以使客户端发送的每条 4 字节消息都触发服务器端的读取回调?
【问题讨论】:
我想知道 libevent 如何触发回调。例如,假设客户端重复发送一条 4 字节的消息。在服务器端,似乎不是每个 4 字节发送都会触发读取回调。例如,我发现回调有时会在接收到 8 字节消息(或其他数字)时触发。是否可以配置 libevent 以使客户端发送的每条 4 字节消息都触发服务器端的读取回调?
【问题讨论】:
我相信您的问题是关于发送,而不是关于接收。由于输出缓冲,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,您通常会:
recv;【讨论】: