複数のネットワークインターフェイスを備えたマシンがあり、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で行われます。