多播侦听和接口IP地址更改

时间:2015-04-24 03:34:27

标签: c linux network-programming multicast

我绑定到多播组和端口以侦听多播流。由于添加组成员资格(通过IP_ADD_MEMBERSHIP)需要指定特定的网络接口,当接口IP地址发生变化时会发生什么?

我是否重新开始使用新套接字并添加会员资格?这与Linux / C环境有关。我确实看到一些数据包在没有改变IP的情况下进入,但我觉得我必须重新启动。

感谢, GL

2 个答案:

答案 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会员报告会发生什么:

Capture IGMP reports

正如您所看到的,IP地址发生更改时,未生成239.254.2.4的新IGMP报告。但是当脚本被杀死时,会发送IGMP离开消息。

虽然任何执行IGMP侦听或多播路由的交换机或路由器都会定期发出IGMP查询,但这可能被视为“漏洞”。我们的主机将通过发送其当前成员资格(包括239.254.2.4的成员资格)来回复此查询。

答案 1 :(得分:0)

我认为你不得不重新加入这个团体。 localhost和路由器都只有成员数,在这两种情况下,如果它不为零,它将在内部传递多播。但我可能是错的。