【问题标题】:UDP multicast sending on wrong NIC (Java, Mac OS X)在错误的 NIC 上发送 UDP 多播(Java、Mac OS X)
【发布时间】:2011-12-21 18:12:57
【问题描述】:

在 Mac OS X(Lion,10.7.2,Java 版本“1.6.0_29”)下处理 Java 应用程序时,我在尝试发送多播 UDP 数据报时遇到了一个奇怪的问题。数据包只在一个网卡上发送,我无法控制哪一个。

以下示例代码说明了我正在尝试做的事情:

public class MCast {
    public static void main(String[] args) throws IOException {
        InetAddress multicastAddr = InetAddress.getByName("224.0.0.1");
        int port = 58680;
        byte[] data = "test".getBytes();

        DatagramPacket packet = new DatagramPacket(data, data.length, multicastAddr, port);

        MulticastSocket socket = new MulticastSocket();
        socket.joinGroup(multicastAddr);
        socket.setNetworkInterface(NetworkInterface.getByName("en0"));

        socket.send(packet);
        System.out.println("Packet sent.");
    }
}

在执行此代码时,我正在使用 Wireshark 检查 en0 上的所有流量。在指定的端口上不发送任何数据包。但是,上述数据包确实出现在 en1 的跟踪中。

当我禁用 en1 时,数据包在 en0 上正常发出。

我在这里不知所措。有谁知道怎么回事?

【问题讨论】:

    标签: java macos udp multicast


    【解决方案1】:

    组播输出接口由加入组时的当前路由表决定。在大多数情况下,这意味着默认路由,因此是 en0。添加显式路由会有所帮助,但您可以将代码中的两行反转为:

    socket.setNetworkInterface(NetworkInterface.getByName("en0"));
    socket.joinGroup(multicastAddr);
    

    此外,如果您只是发送而不收听该组播流量,则无需加入(或bind())该组。而是将connect() 发送到群组地址。

    【讨论】:

      【解决方案2】:

      您可以将地址传递给 MulticastSocket 的构造函数。你可以用它来绑定你想要的地址。

      【讨论】:

      • 通常,这样就可以了。不幸的是,我正在编写的服务的性质要求它位于已被另一个应用程序使用的端口上,并且尝试绑定到它会引发BindException。不过,感谢您的尝试。编辑:或者我可以用我的大脑告诉它与 0 端口绑定。谢谢!
      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2013-01-07
      • 2019-04-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多