java - UDP 组播在错误的 NIC 上发送(Java、Mac OS X)

标签 java macos udp multicast

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

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

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 上正常发送。

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

最佳答案

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

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

此外,如果您只是发送而不是收听多播流量,则不需要加入(也不是 bind())该组。相反,connect() 到组地址。

关于java - UDP 组播在错误的 NIC 上发送(Java、Mac OS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8594385/

相关文章:

java - 通过 APACHE TOMCAT 通过 Windows 中托管的 JSP 从其他计算机运行 Linux VM 中托管的 jsp 页面

java - Avro 模式演变 : Can't add or remove fields

objective-c - 强制 NSAccessibility 画外音阅读未聚焦的 OS X 文本字段?

linux - Windows 以外操作系统的开发者工具

java - 一起使用@Scheduled 和@Async?

java - Maven包出现Ant BuildException : Invalid license info

objective-c - 如何从已知的 PID 中找到 Bundle Identifier?

java - UDP 打洞 Java 示例

C++多UDP socket数据处理

ios - 在 swift 5 中将字节转换为 unicode 文本