socket无法收到组播数据的解决方案

1) 使用tcpdump -i eth0 -nnn udp 查看网卡组播数据地址,例如组播地址:端口为 239.6.7.11:4567
2) route -n 查看是否路由允许1)步骤中的数据进入网口,如果没有,可通过以下命令配置
route add 239.6.7.11/32 dev eth0 # 以239.6.7.11组播数据进入eth0网口为例
或者
route add -net 239.6.7.11 netmask 255.255.255.255 dev eth0
若没有route命令,可使用ip命令
ip route add 239.6.7.11/32 dev eth0
该配置重启后会消失,若要永久添加,可通过修改/etc/sysconfig/network-scripts中对应网口的路由文件进行配置(仅限centos/redhat)

3)关闭防火墙或者增加防火墙规则

CentOS:  
            firewall-cmd --state #查看防火墙当前状态            systemctl stop firewalld 停止防火墙
            systemctl disable firewalld 禁止开机启动
            # 若不想关闭防火墙,可设置规则允许来自eth0(例子)的udp且端口为4567的数据通过
            firewall-cmd --permanent --direct -add-rule ipv4 filter INPUT 0 -i eth0 -p udp --dport 4567 -j ACCEPT
            firewall-cmd --reload 添加规则后重启防火墙

Ubuntu: ufw status 查看防火墙当前状态
            ufw disalbe 停止防火墙
            ufw enable 启动防火墙
            若不想关闭防火墙,可设置规则允许来自eth0(例子)的udp且组播地址为239.6.7.11的数据通过
            ufw allow in proto udp to 239.6.7.11

4) 设置网口的rp_filter

修改/etc/sysctl.conf文件,修改以下内容(假设接收数据的网口为eth0)

net.ipv4.conf.all.rp_filter=0

net.ipv4.conf.default.rp_filter=0

net.ipv4.conf.eth0.rp_filter=0

保存文件后执行以下命令生效

sysctl -p

5) 打开网卡混杂模式

ifconfig eth0 promisc

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注

ICP备案号:辽ICP备20002814号-2