以下代码仅适用于我本地。我可以在另一个程序中的同一台机器上接收它。我看不到wireshark中的任何流量(在Windows上)。如果我将组播地址更改为现有地址(如10.10.10.10),那么我会在wireshark中看到UDP数据包。
在wireshark中我使用过滤器udp.port == 5353.我可以看到一些其他数据包到多播地址,我的wirehark设置是正确的。
防火墙已被禁用。
while(1){
digitalWrite(EN1, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
delay(10000);
digitalWrite(EN1, LOW);
delay(5000);
digitalWrite(EN1, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
delay(10000);
digitalWrite(EN1, LOW);
delay(5000);
}
编辑:原因似乎是环回适配器(MicrosoftLoopbackadapterfürKM-TEST)。如果我删除环回适配器然后它工作。在另一个系统上有一个VMware适配器,它可以产生一个平等的问题。
为什么数据包不会发送到所有网络适配器?如何将其发送到正确的适配器?
答案 0 :(得分:1)
答案 1 :(得分:1)
@EJP是正确的。您不能将该地址用作多播地址。
224.0.0.0和224.0.0.255之间的地址范围,包括端点, 保留用于路由协议和其他低级别 拓扑发现或维护协议,例如网关发现 和组成员报告。 多播路由器不应转发 目的地址在此范围内的任何多播数据报, 无论其TTL如何。
资料来源:IANA - IPv4 Multicast Address Space Registry
换句话说,您选择的多播地址不应该工作,即使它位于多播地址范围内。
答案 2 :(得分:1)
发送单播数据报时,路由表指示使用哪个网络接口发送数据包。对于多播,您需要指定接口。您可以使用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) );
}