在错误的NIC上发送UDP多播(Java,Mac OS X)

时间:2011-12-21 18:12:58

标签: 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上正常运行。

我在这里不知所措。有谁知道发生了什么事?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

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