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



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

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

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

您可以尝试在用户空间中这样做:

MSG_TRUNC(自Linux 2.2起)对于raw(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, ...);

最新更新