【问题标题】:UDP socket (multicast) not receiving data (Ubuntu)UDP 套接字(多播)不接收数据(Ubuntu)
【发布时间】:2014-02-03 15:00:03
【问题描述】:

我正在尝试根据我为 Winsock 编写(并且有效)的一些代码在 Linux (Ubuntu) 上设置一个小测试应用程序。就目前而言,这只是一个小测试,它创建了一个套接字(并且看似成功连接)只是永远挂在 recv() 上而不是接收数据报。这是一个普通的阻塞套接字。

我是这样创建它的:

http://pastebin.com/kcCbgxbB

进一步测试了一些东西: - 端口已打开。 - 其他应用程序能够成功接收来自多播地址的数据。

很明显我忽略了一些东西。非常感谢帮助:-)

【问题讨论】:

  • 您没有检查所有对 setsockopt() 的调用以查看它们是否成功。也许其中一个失败了,这与您的问题有关?
  • 好点,我或多或少认为他们的成功是理所当然的 :) 但是,添加的检查表明他们也成功了。
  • 我试过了,效果很好..
  • 谢谢。重申我的信念,这是一个配置。问题。
  • 由于某种原因,它不适用于 Mac 和 Ubuntu,但当我绑定到 INADDR_ANY 而不是绑定到特定接口时,它在这两种情况下都有效。

标签: c++ sockets ubuntu


【解决方案1】:

在 Unix 系统中,当使用套接字进行多播时,您应该绑定到 INADDR_ANY,而不是接口。

按接口进行多播过滤(即不从指定接口以外的其他接口接收 mcast)已经到位,因为您正确填充了 imr_interface。

【讨论】:

  • 我不会准确地称之为“过滤”。 imr_interface 选择发送 IGMP JOIN 的接口:换句话说,哪个子网知道您的成员资格。如果你让它默认,你让静态 IP 路由表来决定,这在大多数情况下是正确的。在多宿主主机中,可能需要为每个接口发出连接。
  • 在所有情况下,最终的软件都将用于多宿主系统。也就是说,在 Winsock INADDR_ANY 上确实可以正常工作。当将套接字绑定到 ANY 并将接口绑定到特定的 NIC IP 时,组加入总是失败。 -- 但是是的,我现在将恢复为 INADDR_ANY。
【解决方案2】:

所以,最后一点系统配置和错误修复大有帮助:

a) 作为 root,我必须执行以下操作来禁用反向数据包过滤器: 回声 0 > /proc/sys/net/ipv4/conf/all/rp_filter + ethX 也一样。

b) 为 ethX 添加虚假路由(route add -net 224.0.0.0. netmask 224.0.0.0 ethX)

c) 将套接字绑定到要加入的组的 IP(否则任何后续套接字都会从我在该特定端口上加入的所有组中获取所有数据包)。

d) 将 ip_mreq 结构的接口成员设置为我们正在接收的适配器的 IP。

然后一切都很好,花花公子,测试运行快速流畅(拉 125 个多播传输流 @ 大约 800-900 mbit - 当然这可以更智能,但仍然如此)。谢谢大家的指点。

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多