【问题标题】:How to remove packet from UDP read buffer in kernel?如何从内核中的 UDP 读取缓冲区中删除数据包?
【发布时间】:2016-05-10 20:56:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux sockets linux-kernel udp buffer


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,这就是我要找的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多