我有一台带有两个网络接口卡的机器。我想知道是否要向其中一个 LAN 发送多播消息 - 是否必须在该 LAN 中使用机器的 ip,或者可以从 LAN 输入 ant ip?
也就是说,假设机器的 IP 是:190.20.20.20,而该 LAN 中的另一台机器是:190.20.20.1
我可以输入:multcastiScoket.setInterface("190.20.20.1");
如果是这样 - 那台机器是否必须打开?
谢谢你。
虽然多播有其自己的路由特性,但重要的是要了解明确选择 NIC(对于发送方和接收方)很重要并且确实会产生影响(除非您想依赖特定操作系统的“自动”实现,这在生产中会变得非常棘手)。
首先,让我们澄清一下,它java.net.MulticastSocket
可以并且用于:发送和接收消息(这并不意味着发送 MC 和接收 MC 是相似的;接收者必须执行IGMP
连接等,在等上可见ip maddr
等)。
通常,在创建这些套接字时指定的越多越好(否则您将受制于操作系统,并且必然会发生不太容易调试的情况)。
对于接收器套接字,您应该:
udp
对该端口上的入站流量打开,socket.setNetworkInterface
);否则操作系统将采用可用接口之一(通过检查ip maddr
),socket.joinGroup(InetAddress.getByName("230.0.0.0")
)(这会触发 IGMP 机制,通过 可见tcpdump -i your_interface -n ether multicast
)对于 Sender 套接字,您应该类似地,
如果赞成上述观点,我会提出两个论点,
enp0s3
和enp0s8
)测试了简单的发送器和接收器(此处为代码)。只有通过在接收器上设置 NIC 显式性,我才能自信地判断 IGMP 加入将在哪个 NIC 上发出,以及程序将在哪个 NIC 上列出(通过ip maddr
)加入 MC 组;通过将 Sender 设置到特定的 NIC 上,很容易验证,发送enp0s3
只会到达接收者enp0s3
,而不是enp0s8
(类似地,tcpdump
将数据包显示为所选接口上的出站)。当然,在没有开始在 OS 上使用 MC 路由的情况下就是这样,它可以根据需要路由数据包,我希望这会有所帮助(即使问题到现在已经 6 岁了);
IIRCMulticastSocket
用于接收多播消息,您需要对其进行配置setGroup
以侦听绑定到特定多播 IP 地址的多播消息。如果您想发送多播消息,事情要简单得多:您只需将消息发送到特定的多播 IP 地址,路由器/网关将为您处理实际的多播逻辑。(因此,您确实需要一个能够正确支持多播的路由器/网关。)
编辑:Java 教程也涵盖了这个主题:http ://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html
setInterface() 方法中的 IP 地址是您自己的接口之一的地址。这用于您有多个 NIC,全部连接到不同子网的情况,并且您希望多播加入和离开组消息发送到不是 IP 路由表的默认路由的子网。
在您提到的情况下,根本不需要调用 setInterface() 。
如果您希望机器接收消息,则必须打开它。