c - 组播监听和接口(interface)IP地址变化

标签 c linux network-programming multicast

我正在绑定(bind)一个多播组和端口来监听一个多播流。由于添加组成员(通过 IP_ADD_MEMBERSHIP)需要指定特定的网络接口(interface),当该接口(interface) IP 地址更改时会发生什么?

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

谢谢, gl

最佳答案

Linux 内核似乎是根据接口(interface)标识符而不是接口(interface) IP 地址来跟踪接口(interface)。从几个实验来看,您的应用程序似乎不需要任何特殊处理

实验一:主机接收

这是我与 Ubuntu 一起进行的实验,用于测试主机是否会继续通过接口(interface)接收 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 测试脚本,用于在由静态 IP 192.168.33.11 标识的网络接口(interface) eth2 上运行多播接收器:

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 的成员资格)来响应此查询。

关于c - 组播监听和接口(interface)IP地址变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838257/

相关文章:

javascript - 无法在 PHP 上编译共享扩展

c - size 和 objdump 报告文本段的不同大小

python - 如何在 Linux 上递归提取数据?

java - 简单的Java网络IO不适用于大数据

在 C 中使用 Modbus 创建一个简单的客户端/服务器

c - 为什么我的 wsb2812 led 没有按我的预期工作,最后一个 led 不工作

c - for 循环中的某些语句不会在每次迭代时执行

c - 制作一个/dev/hwrng 内核模块,它使用光标位置来生成熵

linux - Docker是如何轻量化的

java - 通过 Java 进行 IP Hook