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

时间:2016-05-10 20:56:23

标签: linux sockets linux-kernel udp buffer

我将编写用于VoIP应用程序的负载/压力测试的工具。大多数经过测试的呼叫都是类似会议的呼叫,其中一个客户端讲话,而其他所有其他人都在收听。在这种情况下,服务器将收到的UDP RTP音频数据包复制到每个侦听客户端在我的加载工具中,我将在基于epoll的循环中等待这些数据包。

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

环境:Linux RedHat 6(7也可以接受),x86_64,gcc。

1 个答案:

答案 0 :(得分:4)

您可以尝试在用户空间中执行此操作:

  

MSG_TRUNC(自Linux 2.2起)       对于原始(AF_PACKET), Internet数据报(自Linux 2.4.27 / 2.6.8),netlink(自Linux 2.6.22起)和UNIX数据报(自Linux 3.4起)套接字:返回实际长度数据包或数据报,即使它比传递的缓冲区长。未针对UNIX域(unix(7))套接字实现。

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