如何从内核中的 UDP 读取缓冲区中删除数据包?

How to remove packet from UDP read buffer in kernel?

我将编写用于 load/stress 测试 VoIP 应用程序的工具。大多数经过测试的通话都是 conference-like 次通话,其中一位客户讲话,而群组中的所有其他人都在聆听。在这种情况下,服务器将收到的 UDP RTP 音频数据包复制到每个侦听客户端。在我的加载工具中,我将在基于 epoll 的循环中等待这些数据包。

问题:当 UDP RTP 数据包到达时,我必须调用 recvfrom 才能接收它。在我的例子中,我不想在大多数情况下处理这个数据包的内容(数据包计数就足够了),所以 recvfrom 不必要地将数据从内核复制到用户 space。对于大型团体,这意味着大量不必要的复制。是否可以要求内核从接收缓冲区中删除此数据包并且不将其传递给用户space?或者以某种方式将它重定向到内核中的 /dev/null ?或者要求内核删除所有数据包并 return 删除了多少?

环境:LinuxRedHat 6(7 也可以),x86_64,gcc。

你可以尝试在用户 space:

MSG_TRUNC (since Linux 2.2) For raw (AF_PACKET), Internet datagram (since Linux 2.4.27/2.6.8), netlink (since Linux 2.6.22) and UNIX datagram (since Linux 3.4) sockets: return the real length of the packet or datagram, even when it was longer than the passed buffer. Not implemented for UNIX domain (unix(7)) sockets.

len = recvfrom(sock, buff, 0, MSG_TRUNC, ...);