1

我在一台 VM Ubuntu 16.04 机器上的 100 个多播组上生成 UDP 数据包,并在另一台 VM Ubuntu 16.04 机器上订阅这些组。两者都在由 Hyper-V 管理器运行的 HP 服务器上。问题是我的应用程序只收到 100 个组中的 2 个。但是,当 Wireshark 捕获时,应用程序开始接收所有消息。

我发现了其他几个类似的问题,比如这个,它解释了因为 Wireshark 在混杂模式下运行,它允许所有数据包通过(通过什么?),这也解释了为什么我的应用程序也开始“看到”它们。因此,将以太网接口配置更改为混杂模式允许应用程序在不运行 Wireshark 的情况下接收所有消息。

但是其他没有正常接收的数据包有什么问题呢?我试图交叉验证“好”和“坏”消息的十六进制转储,它们似乎没有什么不同。IP 和 UDP 级别的校验和是正确的。还有什么问题?

  • 组播 ip 范围 239.1.4.1-100
  • 目的端口 50003
  • 源端口范围 ~33000 - 60900
  • 防火墙被禁用

编辑:

看起来当应用程序仅订阅 8 个多播组时,它工作正常,但是,如果订阅超过 8 个,它只接收 2 个(如果它们以 .7 或 .8 结尾)或不接收,如上所述。所以,我会假设数据包是正确的。问题可能出在网络设置中吗?或者应用程序本身 - 需要在我没有编写的脚本中找到错误。

编辑2:

我在另一台机器上安装了 ISO 映像(虚拟机而不是 HP Windows Server),它可以正常工作。因此,我假设我的应用程序运行良好,并且所有 ubuntu 操作系统配置都是正确的。现在我把所有的责任都归咎于虚拟管理器/设置。有任何想法吗?

4

1 回答 1

1

听起来好像您没有将它们告诉内核。

请参阅http://tldp.org/HOWTO/Multicast-HOWTO-6.html

你必须使用setsockoptwith IP_ADD_MEMBERSHIP。并确保为您的本地接口使用正确的值

于 2017-08-11T17:03:51.263 回答