我绑定到多播组和端口以侦听多播流。由于添加组成员资格(通过IP_ADD_MEMBERSHIP)需要指定特定的网络接口,当接口IP地址发生变化时会发生什么?
我是否重新开始使用新套接字并添加会员资格?这与Linux / C环境有关。我确实看到一些数据包在没有改变IP的情况下进入,但我觉得我必须重新启动。
感谢, GL
答案 0 :(得分:1)
Linux内核似乎是基于接口标识符而不是接口IP地址来跟踪接口。通过几个实验,您的应用程序看起来不需要任何特殊处理
实验1:主持人接收
这是我与Ubuntu一起进行的一项实验,用于测试主机是否会继续通过接口IP更改接收。
$ uname -a
$ Linux joel-VirtualBox 3.16.0-34-generic #47-Ubuntu SMP Fri Apr 10 18:02:58 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
我有一个简单的Python测试脚本,用于在网络接口eth2上运行多播接收器,由静态IP 192.168.33.11标识:
import socket
import struct
sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP )
sock.bind( ('',50400) )
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton('239.254.2.4') + socket.inet_aton('192.168.33.11') )
while True:
print sock.recv( 2048 )
sock.close( sock )
运行python脚本后,我可以通过运行来验证成员身份:
$ netstat -gn
lo 1 224.0.0.1
eth0 1 224.0.0.251
eth0 1 224.0.0.1
eth1 1 224.0.0.1
eth2 1 224.0.0.251
eth2 1 239.254.2.4
eth2 1 224.0.0.1
从另一台PC上,我运行了一个多播发送器,发送到239.254.2.4:50400并验证了数据的打印。然后我将静态IP更改为192.168.33.12并验证netstat仍然报告成员资格,我的python脚本可以继续接收数据。
实验2:IGMP会员报告
我将另一个实验放在一起,看看IGMP会员报告会发生什么:
正如您所看到的,IP地址发生更改时,未生成239.254.2.4的新IGMP报告。但是当脚本被杀死时,会发送IGMP离开消息。
虽然任何执行IGMP侦听或多播路由的交换机或路由器都会定期发出IGMP查询,但这可能被视为“漏洞”。我们的主机将通过发送其当前成员资格(包括239.254.2.4的成员资格)来回复此查询。
答案 1 :(得分:0)
我认为你不得不重新加入这个团体。 localhost和路由器都只有成员数,在这两种情况下,如果它不为零,它将在内部传递多播。但我可能是错的。