0

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

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

4

3 回答 3

2

您可以选择任何未被IANA列为保留的多播地址(224.0.0.0 到 239.255.255.255)。

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

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

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

于 2012-11-23T17:22:30.467 回答
1

你理解错了。

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

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

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

编辑:

结论(澄清)。

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

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

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

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

于 2012-11-23T17:38:30.200 回答