< prev index next >

src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPDirectSocketFactory.java

Print this page
rev 48224 : 8182307: Error during JRMP connection establishment
Summary: Only use SO_REUSEADDR if we're using a fixed ServerSocket port.
Reviewed-by:

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -23,10 +23,11 @@
  * questions.
  */
 package sun.rmi.transport.tcp;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.ServerSocket;
 import java.rmi.server.RMISocketFactory;
 
 /**

@@ -40,8 +41,16 @@
         return new Socket(host, port);
     }
 
     public ServerSocket createServerSocket(int port) throws IOException
     {
-        return new ServerSocket(port);
+        ServerSocket ss = new ServerSocket();
+        if (port == 0) {
+            // Only need SO_REUSEADDR if we're using a fixed port. If we
+            // start seeing EADDRINUSE due to collisions in free ports
+            // then we should retry the bind() a few times.
+            ss.setReuseAddress(false);
+        }
+        ss.bind(new InetSocketAddress(port));
+        return ss;
     }
 }
< prev index next >