【问题标题】:Why is IP_MULTICAST_IF and IPV6_MULTICAST_IF needed?为什么需要 IP_MULTICAST_IF 和 IPV6_MULTICAST_IF?
【发布时间】:2015-01-15 06:18:48
【问题描述】:

比如说,我的机器是多宿主的,有两个网络接口:

  1. 无线 LAN 适配器 WiFi : Ip: 10.20.19.140
  2. 以太网适配器以太网:Ip:10.20.19.154

我创建了两个 UDP 套接字,一个在 (1) 上侦听,另一个在 (2) 上侦听。我假设接口已经分配,​​那我为什么需要 IP_MULTICAST_IF 和 IPV6_MULTICAST_IF?

【问题讨论】:

    标签: windows sockets unix networking multicast


    【解决方案1】:

    IP_MULTICAST_IF 或 IPV6_MULTICAST_IF 设置告诉您的套接字发送其多播数据包的接口。它是一个独立于您使用 bind() 将套接字绑定到的接口的独立设置,因为 bind() 控制套接字从哪个接口接收多播数据包。

    (当然,BSD 套接字 API 实现者可以假设套接字总是希望通过它接收数据包的同一接口发送数据包,但这会使许多用例变得更加困难;例如,如果您正在使用单个套接字从所有接口接收多播数据包(通过 INADDR_ANY),然后在使用该套接字发送数据包时,您仍然需要一种方法来指定要发送该数据包的多播接口)

    【讨论】:

    • 我喜欢这个假设,在这种情况下发送一个数据包可能有以下两种行为之一:1. 在所有接口上发送 2. 像今天一样,在默认接口上发送。
    • 我还有一个问题:比如说,我将两个 UDP 套接字绑定到相同的本地 IP(10.20.19.154)和网络接口,但端口不同(例如,9999 和 9000)。两个套接字都加入了相同的组地址:237.132.100.17:9999。然后从第一个套接字,如果我为组地址发送一个多播数据包。为什么第二个没有收到?当我将第二个端口更改为也绑定到 9999 时,它可以工作。
    • 多播地址(不包括端口号)决定了数据包将发送到哪些计算机。一旦数据包到达计算机,tcp 堆栈会将其提供给绑定到数据包目标端口字段指定的端口的任何套接字。 (在这种情况下为 9999)
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2015-04-18
    • 2021-12-23
    • 2018-11-04
    • 2012-12-28
    • 2013-06-09
    相关资源
    最近更新 更多