我正在侦听来自外部源的多播数据。
当我的应用程序无 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
下运行而又没有两次收到每个数据包?
答案 0 :(得分:0)
在应用程序中两次看到数据包的最可能的原因是,它两次到达主机,或者两次到达同一接口,或者两次到达不同接口。尝试运行数据包捕获(tcpdump
或onload_tcpdump
)以确认是否是这种情况。
此行为与内核中到达“错误”接口的数据包被丢弃的内核不同。通常,Onload会在所有加速接口上安装一个过滤器,以捕获流量,而不仅仅是应用程序指定的流量。