test/java/net/DatagramSocket/PortUnreachable.java

Print this page

        

@@ -29,37 +29,35 @@
  *           exception on Windows 2000.
  */
 import java.net.InetAddress;
 import java.net.DatagramSocket;
 import java.net.DatagramPacket;
+import java.util.concurrent.CountDownLatch;
 import java.io.InterruptedIOException;
 
 public class PortUnreachable implements Runnable {
 
     DatagramSocket clientSock;
     int serverPort;
     int clientPort;
+    CountDownLatch clientReadyLatch;
 
     public void run() {
         try {
             InetAddress addr = InetAddress.getLocalHost();
-
-            Thread.currentThread().sleep(2000);
-
+            Thread.currentThread().sleep(1000);
             // send a delayed packet which should mean a delayed icmp
             // port unreachable
             byte b[] = "A late msg".getBytes();
             DatagramPacket packet = new DatagramPacket(b, b.length, addr,
                                                        serverPort);
             clientSock.send(packet);
 
-            // wait before bringing the server up
-            Thread.currentThread().sleep(5000);
-
             DatagramSocket sock = new DatagramSocket(serverPort);
             b = "Grettings from the server".getBytes();
             packet = new DatagramPacket(b, b.length, addr, clientPort);
+            clientReadyLatch.await();
             sock.send(packet);
             sock.close();
         } catch (Exception e) {
             e.printStackTrace();
         }

@@ -67,33 +65,37 @@
 
     PortUnreachable() throws Exception {
 
         clientSock = new DatagramSocket();
         clientPort = clientSock.getLocalPort();
+        clientReadyLatch = new CountDownLatch(1);
 
         // pick a port for the server
         DatagramSocket sock2 = new DatagramSocket();
         serverPort = sock2.getLocalPort();
-        sock2.close();
 
         // send a burst of packets to the unbound port - we should get back
         // icmp port unreachable messages
         //
         InetAddress addr = InetAddress.getLocalHost();
         byte b[] = "Hello me".getBytes();
         DatagramPacket packet = new DatagramPacket(b, b.length, addr,
                                                    serverPort);
+        //close just before sending
+        sock2.close();
         for (int i=0; i<100; i++)
             clientSock.send(packet);
 
         // start the server thread
-        Thread thr = new Thread(this);
-        thr.start();
+        Thread serverSenderThread = new Thread(this);
+        serverSenderThread.start();
 
         // try to receive
         clientSock.setSoTimeout(10000);
+        clientReadyLatch.countDown();
         clientSock.receive(packet);
+        System.out.println("client received data packet " + new String(packet.getData()));
 
         // done
         clientSock.close();
     }