[英]Multicast listening and interface IP address change
我绑定到多播组和端口以侦听多播流。 由于添加组成员身份(通过IP_ADD_MEMBERSHIP)需要指定特定的网络接口,因此当该接口IP地址更改时会发生什么?
我是否要重新开始使用新的套接字并添加成员身份? 这与Linux / C环境有关。 我确实看到有一些数据包在不更改IP的情况下传入,但是我感觉我必须重新启动。
谢谢,gl
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的成员身份)来响应此查询。
我认为您不必重新加入该小组。 本地主机和路由器都只有一个成员数,在两种情况下,如果非零,它将在内部传递多播。 但是我可能是错的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.