linux - 如果我使用不同于 224.0.0.1 的地址,则不会发送多播数据包

标签 linux sockets networking multicast

我正在使用this code尝试多播。

我在 LAN 中的另一台 PC 上运行wireshark,我正在尝试查看通过网络发送的数据包。

如果数据包发送到 IP 地址 224.0.0.1,它们就会被正确接收,如果我将它们发送到地址 239.255.255.250,它们就会被正确接收。

我的路由表中有此条目

224.0.0.0/4 dev eth0.100  src 192.0.0.1

我知道 192.0.0.1 看起来很奇怪,但它是正确的接口(interface)地址

你知道为什么没有发送数据包吗?

最佳答案

您 try catch 多播流量的电脑很可能启用了多播过滤,并且未启用 239.255.255.250 组的接收。

任何进行多播通信的主机设备都会加入 224.0.0.1(所有主机组),因此发送到该组的数据包会通过过滤器,但发送到 239.255.255.250 的数据包不会通过。

多播过滤通常在网络接口(interface)中实现,接收到的未通过过滤器的帧将在硬件中丢弃,而不是传递到内核驱动程序。如果帧没有传递到内核,则 Wireshark 无法捕获它们。

您可以使用 netstat 验证每个接口(interface)的事件多播组。我假设您使用的是 Linux 系统,因为您用“Linux”标记了问题

netstat -g

当套接字启用 IP_ADD_MEMBERSHIP 时,就会加入多播组。套接字选项。为了加入捕获设备上的组,您需要一个程序来创建套接字并使用 IP_ADD_MEMBERSHIP 套接字选项加入多播组

关于linux - 如果我使用不同于 224.0.0.1 的地址,则不会发送多播数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29607953/

相关文章:

c++ - 游戏消息传递系统的选项

python - Python 中的数据包嗅探器

linux - 当输出文件有字符串时发送电子邮件的 Netcat 脚本

.net - 你如何在 Mono 中使用 ALSA?

linux - 使 cd 运行 php 网站不在 Windows 上

c - kernel_recvmsg 有时会得到错误的数据

java - 无法从Java中的ServerSocket读取数据

linux - 如何从内核代码 (BeagleBone Black) 访问或枚举可用的 LED?

c - 'address already in use' (EADDRINUSE) 与 'bind' 系统调用在不同上下文中的问题

VMware播放器上的java套接字程序: network unavailable