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

UDP多播在错误NIC上发送(Java、Mac OS X),java,macos,udp,multicast,Java,Macos,Udp,Multicast,在Mac OS X(Lion,10.7.2,Java版本“1.6.0_29”)下开发Java应用程序时,我在尝试发送多播UDP数据报时遇到了一个奇怪的问题。数据包只在一个NIC上发送,我无法控制哪个NIC 以下示例代码说明了我正在尝试执行的操作: public class MCast { public static void main(String[] args) throws IOException { InetAddress multicastAddr = InetA

在Mac OS X(Lion,10.7.2,Java版本“1.6.0_29”)下开发Java应用程序时,我在尝试发送多播UDP数据报时遇到了一个奇怪的问题。数据包只在一个NIC上发送,我无法控制哪个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上正常输出


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

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

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

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

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

通常,这样做就可以了。不幸的是,我正在编写的服务的性质要求它位于另一个应用程序已经在使用的端口上,并且试图绑定到它时会抛出一个
BindException
。不过谢谢你的努力。编辑:或者我可以用我的大脑告诉它绑定一个0端口。非常感谢。