【问题标题】:receiving multicast on a server with multiple interfaces (linux)在具有多个接口的服务器上接收多播(linux)
【发布时间】:2011-03-30 08:21:52
【问题描述】:

要在我的非默认 NIC (dvb) 上接收多播,我执行以下操作:

  • 打开一个套接字(AF_INET、SOCK_DGRAM)
  • 在 dvb 接口上使用 IP_ADD_MEMBERSHIP 加入多播地址
  • 绑定多播地址(注意一个常见的错误是绑定“0.0.0.0”然后在该套接字上接收,即使是您不感兴趣的多播)和端口

此时接收所需组播数据包的唯一方法是在路由表中添加一条规则,通过 dvb 到达发送者所在的网络(另一个网络),就好像 dvb 需要回复组播一样发件人;让我们说一种源发送方多播模式。有谁知道发生了什么?这个问题让我很烦,因为原则上我不知道发件人的 ip。

【问题讨论】:

    标签: linux networking routing multicast


    【解决方案1】:

    您似乎被rp_filter 反向路径过滤所刺痛。如果数据包到达没有源地址路由的接口,则会丢弃数据包。

    您可以使用 sysctl /proc/sys/net/ipv4/conf/<if>/rp_filter 在每个接口的基础上禁用它。

    【讨论】:

    • 这似乎是解决方案,我也在这个页面上找到了有用的信息ifup.org/2011/02/03/reverse-path-filter-rp_filter-by-example
    • 这行得通,但是我们必须禁用 rp_filter,而不是在接收多播的接口上,而是在默认情况下在路由表中使用的接口上。​​
    • 很遗憾,@thrantir 的链接不再有效。
    【解决方案2】:

    绑定组播地址

    这绝对是错误的。您必须绑定到真实适配器的实际 IP 地址,即 0.0.0.0。

    注意一个常见的错误是绑定 "0.0.0.0"

    这不是错误。这是正确的程序,除非您只想收听一个 IP 地址。

    然后收到 套接字甚至多播你不是 有兴趣

    我不知道这是什么意思。

    原则上我不知道发件人的ip

    任何 UDP 数据报的发送者的 IP 地址都可以通过套接字 API 获得。

    【讨论】:

    • 不,您需要绑定多播地址,如果绑定真实适配器的 IP 地址,您将不会收到任何多播数据包,如果绑定到 0.0.0.0,则您将 IP 过滤器打开到任何多播。为了根据目标 IP(在本例中为多播地址)进行完美的软件过滤,然后只接收“那个”多播,您需要绑定多播。我建议你阅读 UNP 中的多播章节。
    • @Gaetano Mendola:我在 13 年前读过,谢谢。它在 Windows 上不起作用,而且对 w.r.t 没有意义。 “绑定”的公认定义。
    • 事实在 Windows 上不起作用并不意味着它是错误的。 Windows IP 堆栈并不以标准而闻名,还请注意我提出了我的问题:linux。然后再次在我们的中间件上我们知道它,如果定义了 WIN32,我们绑定接口的 IP 地址,但如果你有一个“好”的 IP 堆栈,那又是错误的。
    • @GaetanoMendola 它也不适用于 Solaris、AIX、BSD、FreeBSD、AIX、HP-UX 等。这是一种 Linux 主义。 Linux != 世界。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 2012-02-26
    • 2011-02-14
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多