Java UDP多播未在多主计算机上跨本地主机传递

Java UDP多播未在多主计算机上跨本地主机传递,java,networking,udp,multicast,Java,Networking,Udp,Multicast,我有一台具有多个网络接口的机器,我正在尝试在其上使用UDP多播。我把它归结为一个小小的复制程序 public class Main { public static void main(String[] args) throws Exception { InetAddress local = InetAddress.getByName("127.0.0.1"); // hangs // InetAddress local = InetAddress.getByName("10.

我有一台具有多个网络接口的机器,我正在尝试在其上使用UDP多播。我把它归结为一个小小的复制程序

public class Main {
  public static void main(String[] args) throws Exception {
    InetAddress local = InetAddress.getByName("127.0.0.1");  // hangs
//    InetAddress local = InetAddress.getByName("10.0.0.145"); // finishes
    List<NetworkInterface> matchingIfs = new ArrayList<NetworkInterface>();
    Enumeration<NetworkInterface> netIfs = NetworkInterface.getNetworkInterfaces();
    while( netIfs.hasMoreElements() ) {
      NetworkInterface netIf = netIfs.nextElement();
      Enumeration<InetAddress> addrs = netIf.getInetAddresses();
      while( addrs.hasMoreElements() ) {
        InetAddress addr = addrs.nextElement();
        if( addr.equals(local) ) {
          matchingIfs.add(netIf);
          break;
        }
      }
    }

    NetworkInterface netIf = matchingIfs.get(0);
    InetAddress addr = InetAddress.getByName("233.245.29.143");
    int port = 59893;
    DatagramPacket sendPack = new DatagramPacket(new byte[1600],1600);
    DatagramPacket recvPack = new DatagramPacket(new byte[1600],1600);

    System.out.println("Using network interface: " + netIf);

    MulticastSocket send = new MulticastSocket();
    send.setTimeToLive(127);
    send.setNetworkInterface(netIf);

    MulticastSocket recv = new MulticastSocket(port);
    recv.setNetworkInterface(netIf);
    recv.joinGroup(addr);

    sendPack.setData("asdfasdf".getBytes());
    sendPack.setAddress(addr);
    sendPack.setPort(port);

    System.out.println("About to send");
    send.send(sendPack);
    System.out.println("Finished send");

    System.out.println("About to recieve");
    recv.receive(recvPack);
    System.out.println("Finished recieve");
    String s = new String(recvPack.getData(), recvPack.getOffset(), recvPack.getLength());
    System.out.println(s);
  }
}
公共类主{
公共静态void main(字符串[]args)引发异常{
InetAddress local=InetAddress.getByName(“127.0.0.1”);//挂起
//InetAddress local=InetAddress.getByName(“10.0.0.145”);//完成
List matchingIfs=new ArrayList();
枚举netIfs=NetworkInterface.getNetworkInterfaces();
while(netIfs.hasMoreElements()){
NetworkInterface netIf=netIfs.nextElement();
枚举地址=netIf.getInetAddresses();
while(addrs.hasMoreElements()){
InetAddress addr=addrs.nextElement();
如果(加法等于(本地)){
匹配如果添加(netIf);
打破
}
}
}
NetworkInterface netIf=matchingIfs.get(0);
InetAddress addr=InetAddress.getByName(“233.245.29.143”);
int端口=59893;
DatagramPacket sendPack=新的DatagramPacket(新字节[1600],1600);
DatagramPacket recvPack=新的DatagramPacket(新字节[1600],1600);
System.out.println(“使用网络接口:+netIf”);
MulticastSocket send=新的MulticastSocket();
send.setTimeToLive(127);
send.setNetworkInterface(netIf);
MulticastSocket recv=新的MulticastSocket(端口);
recv.setNetworkInterface(netIf);
记录joinGroup(地址);
setData(“asdfasdf.getBytes());
sendPack.setAddress(地址);
sendPack.setPort(端口);
System.out.println(“即将发送”);
send.send(sendPack);
System.out.println(“完成发送”);
System.out.println(“即将接收”);
接收(recvPack);
System.out.println(“完成接收”);
字符串s=新字符串(recvPack.getData(),recvPack.getOffset(),recvPack.getLength());
系统输出打印项次;
}
}
如果我不调用
setNetworkInterface
,当主机有多个网络接口时,此程序将挂起

使用
127.0.0.1
运行时,无论网络接口的数量如何,程序都会挂起等待接收

使用
10.0.0.145
(机器IP地址)运行时,程序按预期运行


我的所有测试都是在运行10.8.2的Mac上进行的。

尝试使用
多播套接字启用多播循环。setLoopbackMode
,您是否打算使用jumbograms?我已经尝试使用
setLoopbackMode
true
false
。两者都不会明显改变行为。我不知道什么是巨型图;然而,数据报数据包的大小是从我们实际的代码库复制的,所以我怀疑这是必要的。