我正在开发一个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
recvmmsg
的返回值没有增加如果我看到netstat -suna
的输出,我会看到RcvbufErrors:
的值增加。
如果我看到ifconfig
的输出,则看不到任何丢弃的数据包(RX packets:602492703 errors:0 dropped:0 overruns:0 frame:0
)。
这些是我的问题:
recvmmsg
收到的数据包从来没有超过一个?我尝试调整以下可调参数:
sysctl -w net.core.netdev_max_backlog=10000
sysctl -w net.core.rmem_max=9926214400
请不要建议我切换到TCP。这不是此特定应用程序的选项。谢谢。
答案 0 :(得分:2)
增加接收套接字的接收缓冲区的大小应解决此问题:
setsockopt (fd, IPPROTO_UDP, SO_RCVBUF, desired_receive_buffer_size);
文档here。