首页 > 解决方案 > 接收每个多播数据包两次 Onload?

问题描述

我正在收听来自外部来源的多播数据。

当我的应用程序没有运行 Onload,一切都很好。但是,当我在下面运行时,Onload我会收到每个数据包两次。

这就是我加入多播组的方式:

struct ip_mreq mreq;
bzero(&mreq,sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr("233.1.2.3");
mreq.imr_interface.s_addr = inet_addr("192.1.2.3");

if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
    ...

我怎样才能在Onload不接收每个数据包两次的情况下运行?

标签: clinuxudpmulticastopenonload

解决方案


一个数据包在应用程序中出现两次的最可能原因是它两次到达主机,在同一接口或不同接口上两次。尝试运行数据包捕获 (tcpdumponload_tcpdump) 以确认是否是这种情况。

这种行为不同于内核丢弃到达“错误”接口的数据包。Onload 通常会在所有加速接口上安装过滤器以捕获流量,而不仅仅是应用程序指定的流量。


推荐阅读