在Linux双网卡的机器中,udp组播程序收不到包,但是使用tcpdump可以收到数据。
tcpdump -i ens1 udp port 7891 -w ./udp1.cap
ens1-双网卡中收组播的那个网卡
7891-是组播的端口
如果tcpdump收不到包,那udp1.cap文件就是24字节大小。
在程序实现的时候有两个思路,一个是用网卡接口名,一个是用网卡ip。
1、绑定网卡接口名
在tcpdump中使用的是网卡设备名,但是在程序中如果也使用设备名,即SOL_BINDTODEVICE,没有效果。
int sock;
struct ifreq ifr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
memset(&ifr, 0x00, sizeof(ifr));
memcpy(ifr.ifr_name, "ens1", sizeof(ifr.ifr_name));
setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&ifr, sizeof(ifr));
2、绑定ip地址
在使用本地ip进行网卡设备绑定时候,需要把收组播这块网卡的ip设置成跟组播源的ip在一个域中,其他的设备参数基本不需要改,比如rp_filter:
cat /proc/sys/net/ipv4/conf/ens1/rp_filter
rp_filter参数有三个值,0、1、2,具体含义:
0