UDP多播:我如何知道要发送给哪个组?

时间:2012-11-23 17:10:09

标签: c sockets network-programming udp multicast

我有一个需要在同一局域网上的两台计算机之间进行通信的程序。我对网络很陌生,但从我读过的内容来看,我觉得我想要UDP多播,这样两台计算机就可以相互发现,之后我可以为实际的数据通信建立TCP连接。 I've found this little example for UDP multicasting我可以效仿。但是,我想知道多播组(该示例中的HELLO_GROUP225.0.0.37)。

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

3 个答案:

答案 0 :(得分:2)

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

另一个程序也可能(如果不太可能)使用相同的地址。您可以通过使程序发出适当特定的通知消息来最大限度地减少这种混淆的可能性。 e.g。

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

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

答案 1 :(得分:1)

你理解错了。

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

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

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

修改

结论(澄清)。

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

答案 2 :(得分:0)

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

相反,请使用zero-configuration networking。在mDNS / DNS-SD版本中,这可以通过Apple的OS {X和Windows上的Bonjour库以及Avahi在unices上获得(也可能在OS X和Windows上,不确定)

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