0

複数のネットワークインターフェイスを備えたマシンがあり、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);
  }
}

電話をかけないとsetNetworkInterface、ホストマシンに複数のネットワークインターフェイスがある場合にこのプログラムがハングします。

プログラムを実行すると127.0.0.1、ネットワークインターフェイスの数に関係なく、受信を待機してハングします。

10.0.0.145(マシンのIPアドレス)で実行すると、プログラムは期待どおりに実行されます。

私のテストはすべて、10.8.2を実行しているMacで行われます。

4

0 に答える 0