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

标签 linux sockets linux-kernel udp buffer

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

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

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

最佳答案

你可以尝试在用户空间做:

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, ...);

关于linux - 如何从内核中的 UDP 读取缓冲区中删除数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148830/

相关文章:

c++ - Qt的QTcpSocket ReadyRead信号的实现

c - 如何使用阅读链接

c++ - 读取网络数据的最快方法?

c - 使用wordexp时保留引号

Linux 查找命令 shell 扩展

c++ - 获取 boost::asio::async_read 读取的字节数

c - 如何制作 "careless"套接字?

linux - 无法为 BeagleBone Debian 编译内核模块

c - CentOS 版本之间的 glibc 差异

linux - Windows Linux Bash 运行时错误的变量名称/bin/sh -c "$(curl -fsS https://install.airshipcms.io)"