我将编写用于 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/