![](/img/trans.png)
[英]Why DatagramSocket.joinGroup() method takes a SocketAddress if the port does not matter for a multicast group?
[英]Why a DatagramSocket does not send over the network with multicast address?
以下代码仅适用于我本地。 我可以在另一个程序中的同一台机器上接收它。 我看不到wireshark中的任何流量(在Windows上)。 如果我将组播地址更改为现有地址(如10.10.10.10),那么我会在wireshark中看到UDP数据包。
在wireshark中,我使用过滤器udp.port == 5353.我可以看到一些其他数据包到多播地址,我认为我的wireshark设置是正确的。
防火墙已禁用。
public static void main( String[] args ) throws Exception {
byte[] buf = "some data".getBytes();
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName( "224.0.0.251" );
socket.send( new DatagramPacket( buf, buf.length, address, 5353 ) );
}
编辑:原因似乎是一个环回适配器(MicrosoftLoopbackadapterfürKM-TEST)。 如果我删除环回适配器然后它工作。 在另一个系统上有一个VMware适配器可以产生一个等于问题。
为什么数据包不会发送到所有网络适配器? 如何将其发送到正确的适配器?
@EJP是对的。 您不能将该地址用作多播地址。
224.0.0.0和224.0.0.255之间的地址范围(包括端点)保留用于路由协议和其他低级拓扑发现或维护协议,例如网关发现和组成员身份报告。 无论TTL如何,多播路由器都不应转发目标地址在此范围内的任何多播数据报。
来源:IANA - IPv4多播地址空间注册表
换句话说,您选择的多播地址不应该工作,即使它在多播地址范围内。
发送单播数据报时,路由表指示使用哪个网络接口发送数据包。 对于多播,您需要指定接口。 您可以使用MulticastSocket
执行此操作。
假设您要发送的接口的IP是10.10.10.1,您将执行以下操作:
public static void main( String[] args ) throws Exception {
byte[] buf = "some data".getBytes();
MulticastSocket socket = new MulticastSocket();
socket.setNetworkInterface(NetworkInterface.getByInetAddress(
InetAddress.getByName( "10.10.10.1" )));
InetAddress address = InetAddress.getByName( "224.0.0.251" );
socket.send( new DatagramPacket( buf, buf.length, address, 5353) );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.