【问题标题】:UDP multicasting: how do I know which group to send to?UDP 多播:我如何知道要发送到哪个组?
【发布时间】:2012-11-23 17:10:08
【问题描述】:

我有一个小程序需要在同一 LAN 上的两台计算机之间进行通信。我对网络比较陌生,但从我读过的内容来看,这听起来像是我想要 UDP 多播,以便两台计算机可以发现彼此,之后我可以建立 TCP 连接以进行实际数据通信。 I've found this little example for UDP multicasting 我可以关注。但是,我想知道多播组(在该示例中为HELLO_GROUP,即225.0.0.37)。

我如何知道我应该使用哪个组?这个程序将在各种网络上运行,所以我不能硬编码一个(据我所知)。我是否从路由器获取组,如果是,我该怎么做?

【问题讨论】:

    标签: c sockets network-programming udp multicast


    【解决方案1】:

    您可以选择任何不是 IANA 提供的listed as reserved 的多播地址(224.0.0.0 到 239.255.255.255)。

    有可能(如果不太可能)另一个程序也将使用相同的地址。您可以通过使您的程序发出的公告消息适当地具体化来最大限度地减少这种造成任何混乱的可能性。例如

    CORNSTALKS-DISCOVERY
    HOST: {address:port}
    [newline]
    

    这将通知您的收件人用于他们的 TCP 连接的地址,但应该发现它的第一行被任何其他收件人拒绝。

    【讨论】:

    • 酷。所以,只是为了仔细检查,我可以指定任何地址(在你指定的范围内),这没关系,它应该(理论上)工作?
    • @Cornstalks 差不多。该范围内的任何地址,除了列为保留的地址之外,都可以正常工作。
    【解决方案2】:

    你理解错了。

    你说的是广播。广播 UDP 数据报被发送到子网中的每台计算机。 (从技术上讲,您将数据报发送到地址 255.255.255.255。)

    UDP 广播在特定子网内工作,但不跨越子网边界。也就是说,大多数路由器都配置为不路由广播数据报(减少垃圾邮件)。

    OTOH 多播是完全不同的东西。多播的目的是避免使用 TCP(或任何其他单播)进行数据传输。当您需要“一次”向许多其他收件人发送内容时,这很好。这些机器初步同意特定的多播地址(例如您的示例中的 225.0.0.37),并“加入”该多播组。在一个特定的子网中,一切都与广播非常相似,但是与广播相比,多播也可能跨越子网边界。这是因为当机器加入多播组时,会通知适当的路由器,并且它们能够适当地路由多播数据报。

    编辑:

    结论(澄清)。

    1. 为了使用多播,必须选择多播地址。这就像为应用程序选择一个端口。
    2. 多播的主要目的是将内容(传输数据)传递给多个接收者。在这种情况下,它比单播更有效。
    3. “网络发现”通常通过广播完成。理论上,多播也可以用于此目的,但这就像用大炮杀死苍蝇(因为路由器还应该跟踪多播会话的生命周期)。

    【讨论】:

    • 你的答案被删了吗?我真的从中得到了很多,然后它就以“rou...”结束了
    • 但是,多播可以用于初始集合。如果潜在的对等方加入同一个多播组,他们就可以通过向它发送来找到对方。这避免了广播(尽管是在链路层广播之上实现的单个子网上的多播?),并且还有可能让不同子网上的对等方找到彼此,这是广播永远无法做到的。
    • @Cornstalks:对不起,答案没有被删减,最后只是包含了一些“垃圾”。尽管如此,我已经解决了这个问题并添加了一些最后的话。
    • @Tom Anderson:你是对的。但这就像用大炮杀死苍蝇一样,因为多播实现(即通过 PC 配置路由器)并非易事。
    • 我看不出 OP 误解了什么,也看不出 OP 怎么可能被解释为谈论广播。 -1
    【解决方案3】:

    我建议你不要直接使用多播。

    而是使用zero-configuration networking。在其 mDNS/DNS-SD 化身中,可以通过 Apple 在 OS X 和 Windows 上的 Bonjour 库和在 unices 上的 Avahi 获得(也可能在 OS X 和 Windows 上,不确定)。

    使用 DNS-SD,您可以为服务定义一个名称,然后使用该库在给定主机上公布其可用性,或浏览可用的主机。这就是 Mac 发现打印机、文件共享等的方式——我相信这正是你的用例。这是一种简单但非常有效的技术。而且它是一个具有良好开源实现的开放标准,所以这不是 Apple 专有的可怕时期。

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 2014-08-06
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多