C++ 使用 recvmmsg 丢弃 UDP 数据包
c++ drops udp packets with recvmmsg
我正在开发一个 c++ 程序,该程序通过以太网使用来自 FPGA 的 UDP 数据流。 FPGA 和以太网卡之间没有集线器或路由器。 数据为 10446 pps,速率为 125350.0 kbps。
我的 c++ 应用程序使用专用线程和 recvmmsg 来清空数据。 每个数据包都有一个序列号作为前 4 个字节,后跟 1468 字节的流数据。 我正在使用recvmmsg,我已经尝试了VLEN
(10,100)和MSG_WAITFORONE
,MSG_DONTWAIT
,0
标志的组合。
我看到的症状是这样的:
- 在程序启动之前,流以固定速度运行。
- 当程序启动时,我有一个很短的初始周期,其中
recvmmsg
的返回值与VLEN
相同。 如果我理解正确,这是 Linux 内核缓冲区的耗尽。 - 在此之后,我总是得到一个值
1
作为返回值recvmmsg
- 如果我在系统上造成较小的负载(例如调整 gui 窗口的大小)。我看到 UDP 数据包丢弃,如缺少序列号所示。 (没有重新排序,只是缺少)。
- 在下降期间/之后,我没有获得更大的返回值
recvmmsg
- Wireshark/tcpdump 不显示任何缺失的数据,所有序列号都存在。
如果我观察netstat -suna
的输出,我看到RcvbufErrors:
的值增加。
如果我观察ifconfig
的输出,我看不到任何丢弃的数据包(RX packets:602492703 errors:0 dropped:0 overruns:0 frame:0
)。
这些是我的问题:
- 为什么在丢弃情况下,我永远不会从
recvmmsg
收到多个数据包? - 为什么 wireshark 能够捕获数据包,而我的 c++ 不能? 我
- 可以使用哪些工具来更好地了解我为什么会掉线?
我尝试调整以下可调参数:
sysctl -w net.core.netdev_max_backlog=10000
sysctl -w net.core.rmem_max=9926214400
请不要建议我切换到TCP。 这不是此特定应用程序的选项。 谢谢。
增加接收套接字的接收缓冲区的大小应该可以解决此问题:
setsockopt (fd, IPPROTO_UDP, SO_RCVBUF, desired_receive_buffer_size);
文档在这里。
相关文章:
- 发送固定大小的 UDP 数据包
- 使用C++将UDP数据包存储在Structure中
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- Qt 在可预测的秒数后跳过 UDP 数据包
- 高频接收UDP数据包:丢包?
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 了解 UDP 数据包大小限制的 TCP 数据包大小限制以及它在 boost::asio 编程级别的含义
- 获取进入UDP数据包的目标端口
- 操纵Windows Explorer窗口时,UDP数据包会掉落
- C++ 使用 recvmmsg 丢弃 UDP 数据包
- 如何在QT中接收适当的UDP数据包
- 使用ASIO捕获大量UDP数据包
- 如何正确接收多播UDP数据包
- 服务器未收到UDP数据包,花费数小时试图找出问题所在
- 当接收缓冲区几乎满时,阻止UDP数据包被部分截断
- 如何检查UDP数据包是否在发送器上发送
- 使用 QNX 实时操作系统实时接收 UDP 数据包
- 高效地发送UDP数据包流
- 为什么我在使用 winsock 时没有收到 UDP 数据包?
- SDL_net UDP 数据包数据