【问题标题】:Do I need a PORT when joining a multicast group or just the IP?加入多播组时需要 PORT 还是只需要 IP?
【发布时间】:2014-08-13 19:20:26
【问题描述】:

我想一劳永逸地学习这一点。连接多播套接字的过程是什么?我知道您必须绑定到本地接口(您需要 IP 和端口吗?)然后我知道您必须加入一个组(您是否需要 IP:PORT 作为您要加入的地址和网络接口! !!??),然后你终于可以离开小组了。

有经验的人能否澄清一下这么多地址的全部内容?我将在下面列出:

  • 绑定地址 (IP:PORT)
  • 网络地址 (IP:PORT)
  • 组播地址 (IP:PORT)

这里的多播在哪里,什么是?

【问题讨论】:

    标签: linux sockets networking udp multicast


    【解决方案1】:

    多播组是一个特殊的 IP 地址。您可以使用套接字选项 IP_ADDMEMBERSHIP 通过setsockopt() 加入它,或者例如在 Java 中通过MulticastSocket.joinGroup()。这里没有端口号。如果您想通过特定的本地地址加入,请使用指定本地地址的重载,或先调用setNetworkInterface()

    绑定到本地地址是一个单独的操作,它主要确定套接字可以在哪些本地地址上发送和接收数据:一个或全部:一个本地地址,这决定了您正在侦听的可用子网to 并且可以通过或端口发送,或两者兼而有之。通常最好使用 INADDR_ANY 作为绑定地址,除非您的应用程序神奇地知道网络拓扑。

    您可以在 Linux 中绑定到多播地址这一事实混淆了这一点,但这似乎是我们现在一直存在的误解。

    您通过发送到多播地址来发送到多播组。

    【讨论】:

    • 谢谢EJP,但我还是不明白。 Java 的 DatagramChannelImpl.joinGroup 采用 SocketAddress(带端口)。所以我猜你是说多播地址(IP)也称为多播组,对吗?我想了解这三个地址的区别和用途:MulticastAddress、NetworkAddress 和 BindAddress。
    • @EJB 我打开了另外两个问题来补充这个问题。我真的很想明白这一点:他们是:stackoverflow.com/questions/9468991/…stackoverflow.com/questions/9469036/…
    • 绑定时是否可以指定“任意”端口?
    • @yvesBaumes 是的,只需指定端口 0。很难看出重点。如果您是客户端,则根本不需要绑定,如果您是服务器,则需要绑定到固定端口。
    【解决方案2】:

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

    Good quick explanation

    Some sample source code in C and other languages

    【讨论】:

    • 不是我的反对意见,但你还没有回答这个问题。他没有问发送和接收,他问的是加入。
    • 我希望更多地了解这三个地址在这个故事中各自扮演的角色(什么目的)。
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多