首页 > 解决方案 > c++ 使用 recvmmsg 丢弃 udp 数据包

问题描述

我正在开发一个 c++ 程序,它通过以太网使用来自 FPGA 的 UDP 数据流。FPGA 和我的以太网卡之间没有集线器或路由器。数据为 10446 pps,速率为 125350.0 kbps。

我的 c++ 应用程序使用专用线程和 recvmmsg 来清空数据。每个数据包的前 4 个字节都有一个序列号,后面是 1468 个字节的流数据。我正在使用 recvmmsg 并且我已经尝试过VLEN(10,100) 和 , 的组合MSG_WAITFORONE作为MSG_DONTWAIT标志0

我看到的症状是这样的:

如果我观察 的输出netstat -suna,我会看到 的值增加 RcvbufErrors:

如果我看ifconfig我没有看到任何丢弃的数据包(RX packets:602492703 errors:0 dropped:0 overruns:0 frame:0)的输出。

这些是我的问题:

我尝试调整以下可调参数:

请不要建议我切换到 TCP。这不是此特定应用程序的选项。谢谢。

标签: c++socketsudp

解决方案


增加接收套接字的接收缓冲区的大小应该可以解决这个问题:

setsockopt (fd, IPPROTO_UDP, SO_RCVBUF, desired_receive_buffer_size);

文档在这里


推荐阅读