Linux 上 Java 和 Zeroconf (avahi) 的多播问题

Posted

技术标签:

【中文标题】Linux 上 Java 和 Zeroconf (avahi) 的多播问题【英文标题】:Multicast Problems with Java and Zeroconf (avahi) on Linux 【发布时间】:2012-07-16 15:49:05 【问题描述】:

我正在尝试为 VM 开发一个基于 Java 的解决方案,该解决方案在开始时不知道应该从列表中自行选择哪个静态 IP 地址。我对解决方案的想法是:

    使用 Zeroconf/avahi 为 VM 选择 IP 地址 VM 使用多播广播它们的 MAC 地址。每个虚拟机都知道对等 MAC 地址的预期数量。 一旦所有 VM 收到所有其他 MAC 地址,它们就会按字母顺序对其进行排序,并根据其 MAC 地址在列表中的位置(IP.1、IP.2 等)选择一个 IP。

请注意,DHCP 在任何情况下都无法在此环境中使用,我正在尝试找到解决此问题的方法

我想帮助解决这个异常。如果您能提供帮助,请告诉我。谢谢!!

java.net.SocketException: No such device
    at java.net.PlainDatagramSocketImpl.join(Native Method)
    at java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:178)
    at java.net.MulticastSocket.joinGroup(MulticastSocket.java:319)

这是我正在使用的 Java 代码:

InetAddress address = InetAddress.getByName(mIPAddress);
SocketAddress addr = new InetSocketAddress(address, mPort);
MulticastSocket multiSocket = new MulticastSocket(addr);
multiSocket.joinGroup(address);

这是 /sbin/ifconfig 的输出:

eth0      Link encap:Ethernet  HWaddr 08:00:27:1D:BB:21  
      inet6 addr: fe80::a00:27ff:fe1d:bb21/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:152 errors:0 dropped:0 overruns:0 frame:0
      TX packets:182 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:35179 (34.3 KiB)  TX bytes:36383 (35.5 KiB)

eth0:avahi Link encap:Ethernet  HWaddr 08:00:27:1D:BB:21  
      inet addr:169.254.4.55  Bcast:169.254.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:2957 errors:0 dropped:0 overruns:0 frame:0
      TX packets:2957 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:4448536 (4.2 MiB)  TX bytes:4448536 (4.2 MiB)

编辑:添加路由表:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0

【问题讨论】:

您的路由表在 IP 前设置中是什么样的? 我可以稍后添加特定的输出,但它确实包含 Zeroconf 行。它只包括那一行。 感谢 Nikolai 将我指向路由表。我能够通过使用“route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0”更新表来使其工作。如果你想回答这个问题,我很乐意接受。再次感谢!! 没问题。添加了答案。 【参考方案1】:

最终加入多播组的接口是通过路由表决定的,因此您需要一条默认路由,或者一条与您的多播地址匹配的特定路由。

【讨论】:

以上是关于Linux 上 Java 和 Zeroconf (avahi) 的多播问题的主要内容,如果未能解决你的问题,请参考以下文章

本地.local域名访问实现

[20171115]ZEROCONF ROUTE.txt

Zeroconf和Python

如何使用 Mono.Zeroconf 制作 AirPlay 接收器

检测 MDNS/Zeroconf 设备适用于 Android 5.1.1,但不适用于 Android 7

Android 可以通过蓝牙支持 Zeroconf/Bonjour 吗? TCP/IP 怎么样?