diff --git a/test/java/net/MulticastSocket/NoLoopbackPackets.java b/test/java/net/MulticastSocket/NoLoopbackPackets.java index 83419886880417458f4de3559a8f89c0852799da..7953d513eb5bb38061ae143ccf9e8dcd5ae34d80 100644 --- a/test/java/net/MulticastSocket/NoLoopbackPackets.java +++ b/test/java/net/MulticastSocket/NoLoopbackPackets.java @@ -29,9 +29,7 @@ import java.util.*; import java.net.*; - public class NoLoopbackPackets { - private static int PORT = 9001; private static String osname; static boolean isWindows() { @@ -68,40 +66,47 @@ public class NoLoopbackPackets { return; } - // we will send packets to three multicast groups :- - // 224.1.1.1, ::ffff:224.1.1.2, and ff02::1:1 - // - List groups = new ArrayList(); - groups.add(new InetSocketAddress(InetAddress.getByName("224.1.1.1"), PORT)); - groups.add(new InetSocketAddress(InetAddress.getByName("::ffff:224.1.1.2"), PORT)); - groups.add(new InetSocketAddress(InetAddress.getByName("ff02::1:1"), PORT)); - - Thread sender = new Thread(new Sender(groups)); - sender.setDaemon(true); // we want sender to stop when main thread exits - sender.start(); - - // Now try to receive multicast packets. we should not see any of them - // since we disable loopback mode. - // - MulticastSocket msock = new MulticastSocket(PORT); - msock.setSoTimeout(5000); // 5 seconds - - byte[] buf = new byte[1024]; - DatagramPacket packet = new DatagramPacket(buf, 0, buf.length); + MulticastSocket msock = null; List failedGroups = new ArrayList(); - for (SocketAddress group : groups) { - msock.joinGroup(group, null); - - try { - msock.receive(packet); + try { + msock = new MulticastSocket(); + int port = msock.getLocalPort(); + + // we will send packets to three multicast groups :- + // 224.1.1.1, ::ffff:224.1.1.2, and ff02::1:1 + // + List groups = new ArrayList(); + groups.add(new InetSocketAddress(InetAddress.getByName("224.1.1.1"), port)); + groups.add(new InetSocketAddress(InetAddress.getByName("::ffff:224.1.1.2"), port)); + groups.add(new InetSocketAddress(InetAddress.getByName("ff02::1:1"), port)); + + Thread sender = new Thread(new Sender(groups)); + sender.setDaemon(true); // we want sender to stop when main thread exits + sender.start(); + + // Now try to receive multicast packets. we should not see any of them + // since we disable loopback mode. + // + msock.setSoTimeout(5000); // 5 seconds + + byte[] buf = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buf, 0, buf.length); + for (SocketAddress group : groups) { + msock.joinGroup(group, null); + + try { + msock.receive(packet); + + // it is an error if we receive something + failedGroups.add(group); + } catch (SocketTimeoutException e) { + // we expect this + } - // it is an error if we receive something - failedGroups.add(group); - } catch (SocketTimeoutException e) { - // we expect this + msock.leaveGroup(group, null); } - - msock.leaveGroup(group, null); + } finally { + if (msock != null) try { msock.close(); } catch (Exception e) {} } if (failedGroups.size() > 0) { @@ -111,36 +116,36 @@ public class NoLoopbackPackets { throw new RuntimeException("test failed."); } } -} - -class Sender implements Runnable { - private List sendToGroups; - public Sender(List groups) { - sendToGroups = groups; - } + static class Sender implements Runnable { + private List sendToGroups; - public void run() { - byte[] buf = "hello world".getBytes(); - List packets = new ArrayList(); + public Sender(List groups) { + sendToGroups = groups; + } - try { - for (SocketAddress group : sendToGroups) { - DatagramPacket packet = new DatagramPacket(buf, buf.length, group); - packets.add(packet); - } + public void run() { + byte[] buf = "hello world".getBytes(); + List packets = new ArrayList(); - MulticastSocket msock = new MulticastSocket(); - msock.setLoopbackMode(true); // disable loopback mode - for (;;) { - for (DatagramPacket packet : packets) { - msock.send(packet); + try { + for (SocketAddress group : sendToGroups) { + DatagramPacket packet = new DatagramPacket(buf, buf.length, group); + packets.add(packet); } - Thread.currentThread().sleep(1000); // 1 second + MulticastSocket msock = new MulticastSocket(); + msock.setLoopbackMode(true); // disable loopback mode + for (;;) { + for (DatagramPacket packet : packets) { + msock.send(packet); + } + + Thread.sleep(1000); // 1 second + } + } catch (Exception e) { + throw new RuntimeException(e); } - } catch (Exception e) { - throw new RuntimeException(e); } } }