当加入一个多播组时,我需要端口还是只需要IP?

8
我想彻底了解一下。连接多播套接字的过程是什么?我知道你必须绑定到本地接口(需要IP和端口吗?),然后我知道你必须加入一个组(你需要IP:PORT以加入要加入的地址和网络接口吗?!),最后你可以离开该组。
有经验的人能否澄清这些众多地址的全部内容?我将列出如下:
- BindAddress(IP:PORT) - NetworkAddress(IP:PORT) - MulticastAddress(IP:PORT)
在这里,多播组在哪里以及是什么?
2个回答

8
一个多播组是一个特殊的IP地址。您可以通过使用套接字选项IP_ADD_MEMBERSHIP来加入它,例如在Java中通过MulticastSocket.joinGroup()。这里没有端口号。如果您想通过特定的本地地址加入,请使用指定本地地址的重载,或者先调用setNetworkInterface()。
绑定到本地地址是一个单独的操作,主要确定套接字可以在哪些本地地址上发送和接收数据:一个或全部:一个本地地址,确定您正在侦听和可以通过的可用子网之一,或一个端口,或两者兼备。通常最好使用INADDR_ANY作为绑定地址,除非您的应用程序神奇地了解网络拓扑。
这被Linux中可以绑定到多播地址的事实所混淆,但这似乎是一个误解,现在将永远存在。
您可以通过发送到多播地址来发送到多播组。

谢谢EJP,但我仍然不理解。Java的DatagramChannelImpl.joinGroup方法需要一个SocketAddress(包括端口)。所以我猜您是在说多播地址(IP)也被称为多播组,对吗?我想了解这三个地址:多播地址、网络地址和绑定地址的区别和用途。 - chrisapotek
@EJB 我开了两个额外的问题来补充这个问题。我真的很想理解这个问题:它们在这里:https://dev59.com/w2DVa4cB1Zd3GeqPh-tM 和 http://stackoverflow.com/questions/9469036/why-datagramsocketimpl-joingroup-method-takes-a-networkinterface-if-the-socket-m - chrisapotek
2
在绑定时是否可以指定“任意”端口? - yves Baumes
@yvesBaumes 是的,只需指定端口零。很难看出重点。如果你是客户端,你甚至不需要绑定任何东西,如果你是服务器,你需要绑定到一个固定的端口。 - user207421

1

是的,你必须定义发送/接收多播消息的地址和端口。这些是UDP数据包,因此网络堆栈需要地址和端口才能将消息正确地传递到参与进程。因此,要监听特定一组多播消息,您的应用程序需要绑定到特定的多播IP地址和端口组合(显然为机器上的一组或所有接口)。组由地址/端口组合定义。

良好的快速解释

C和其他语言的一些示例源代码


不是我点的踩,但你没有回答问题。他没有问如何发送和接收,他问的是如何加入。 - user207421
我更想了解这三个地址在这个故事中扮演的角色(目的)是什么。 - chrisapotek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接