diff --git a/src/java/com/threerings/presents/server/PresentsServer.java b/src/java/com/threerings/presents/server/PresentsServer.java index fa31814b6..8c07a64d8 100644 --- a/src/java/com/threerings/presents/server/PresentsServer.java +++ b/src/java/com/threerings/presents/server/PresentsServer.java @@ -157,7 +157,8 @@ public class PresentsServer _clmgr.setInjector(injector); // configure our connection manager - _conmgr.init(getBindHostname(), getListenPorts(), getDatagramPorts()); + _conmgr.init(getBindHostname(), getDatagramHostname(), + getListenPorts(), getDatagramPorts()); // initialize the time base services TimeBaseProvider.init(_invmgr, _omgr); @@ -224,14 +225,23 @@ public class PresentsServer } /** - * Returns the hostname on which the connection manager will listen for TCP and datagram - * traffic, or null to bind to the wildcard address. + * Returns the hostname on which the connection manager will listen for TCP traffic, or + * null to bind to the wildcard address. */ protected String getBindHostname () { return null; } + /** + * Returns the hostname on which the connection will listen for datagram traffic, or + * null to bind to the wildcard address. + */ + protected String getDatagramHostname () + { + return null; + } + /** * Returns the port on which the connection manager will listen for client connections. */ diff --git a/src/java/com/threerings/presents/server/net/ConnectionManager.java b/src/java/com/threerings/presents/server/net/ConnectionManager.java index 6c93663a3..c8df0416b 100644 --- a/src/java/com/threerings/presents/server/net/ConnectionManager.java +++ b/src/java/com/threerings/presents/server/net/ConnectionManager.java @@ -105,12 +105,16 @@ public class ConnectionManager extends LoopingThread * socket connections and datagram packets. This must be called before the connection manager * is started (via {@via #start}) as the sockets will be bound at that time. * - * @param bindHostname the port to which to bind our sockets or null to bind to all interfaces. + * @param bindHostname the hostname to which we bind our sockets or null to bind to all + * interfaces. + * @param datagramHostname the hostname to which we bind our datagram socket or null to bind + * to all interfaces. * @param ports the ports on which to listen for TCP connection. * @param datagramPorts the ports on which to listen for datagram packets. */ - public void init (String bindHostname, int[] ports, int[] datagramPorts) - throws IOException + public void init ( + String bindHostname, String datagramHostname, int[] ports, int[] datagramPorts) + throws IOException { Preconditions.checkArgument(ports != null, "Ports must be non-null."); Preconditions.checkArgument(datagramPorts != null, "Datagram ports must be non-null. " + @@ -118,6 +122,7 @@ public class ConnectionManager extends LoopingThread Preconditions.checkState(!super.isRunning(), "Must initialize before starting."); _bindHostname = bindHostname; + _datagramHostname = datagramHostname; _ports = ports; _datagramPorts = datagramPorts; _selector = SelectorProvider.provider().openSelector(); @@ -362,7 +367,7 @@ public class ConnectionManager extends LoopingThread _ssocket = ServerSocketChannel.open(); _ssocket.configureBlocking(false); - InetSocketAddress isa = getAddress(port); + InetSocketAddress isa = getAddress(_bindHostname, port); _ssocket.socket().bind(isa); registerChannel(_ssocket); successes++; @@ -414,23 +419,23 @@ public class ConnectionManager extends LoopingThread _datagramChannel = DatagramChannel.open(); _datagramChannel.socket().setTrafficClass(0x10); // IPTOS_LOWDELAY _datagramChannel.configureBlocking(false); - InetSocketAddress isa = getAddress(port); + InetSocketAddress isa = getAddress(_datagramHostname, port); _datagramChannel.socket().bind(isa); registerChannel(_datagramChannel); log.info("Server accepting datagrams on " + isa + "."); } catch (IOException ioe) { - log.warning("Failure opening datagram channel", "hostname", _bindHostname, + log.warning("Failure opening datagram channel", "hostname", _datagramHostname, "port", port, ioe); } } } /** Helper function for creating proper bindable socket addresses. */ - protected InetSocketAddress getAddress (int port) + protected InetSocketAddress getAddress (String hostname, int port) { - return StringUtil.isBlank(_bindHostname) ? - new InetSocketAddress(port) : new InetSocketAddress(_bindHostname, port); + return StringUtil.isBlank(hostname) ? + new InetSocketAddress(port) : new InetSocketAddress(hostname, port); } /** Helper function for {@link #willStart}. */ @@ -1217,7 +1222,7 @@ public class ConnectionManager extends LoopingThread protected List _authors = Lists.newArrayList(); protected int[] _ports, _datagramPorts; - protected String _bindHostname; + protected String _bindHostname, _datagramHostname; protected Selector _selector; protected ServerSocketChannel _ssocket; protected DatagramChannel _datagramChannel;