路由器有60个tun设备,每个设备配置有效的ipv4地址,60个原始套接字分别基于这些设备。这些套接字都加入了一个muticast组。还有另一台设备不断向这些套接字发送组播数据包。
如果禁用然后重新启用这些接口,某些接口将接收属于其他接口的组播数据包。
通过禁用接口,我的意思是close()socket;
通过启用接口,我的意思是使用socket()和setsockopt()创建套接字,例如SO_BINDTODEVICE,IP_ADD_MEMBERSHIP,IP_MULTICAST_IF,IP_MULTICAST_LOOP。
具体来说,如果我禁用interface1,2,3 ..,60,然后启用interface1,2,3..60,启用接口后,有时从接口N的原始套接字接收的第一个数据包实际上属于接口(N -1)。
我tcpdump接口N的数据包,所有数据包都是正确的,但原始套接字的recv()接收属于其他接口的数据包。
有人对此有任何想法吗?谢谢!