diff options
-rw-r--r-- | CHANGELOG.md | 4 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/service/TerminalManager.java | 11 | ||||
-rw-r--r-- | app/src/main/java/org/connectbot/transport/Telnet.java | 19 |
3 files changed, 27 insertions, 7 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 06e089d..0c563ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,8 +16,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). - More context is given for failures to connect via SSH which should reveal why a host might be incompatible with ConnectBot. - SSH key exchange algorithm will now be printed upon connection. -- SSH: all addresses for a particular host will be tried when - connecting. This includes IPv6. +- All addresses for a particular host will be tried when connecting + (including IPv6). ## [1.8.3][1.8.3] - 2014-04-02 ### Fixed diff --git a/app/src/main/java/org/connectbot/service/TerminalManager.java b/app/src/main/java/org/connectbot/service/TerminalManager.java index 3bf9841..31838a2 100644 --- a/app/src/main/java/org/connectbot/service/TerminalManager.java +++ b/app/src/main/java/org/connectbot/service/TerminalManager.java @@ -170,7 +170,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen public void onDestroy() { Log.i(TAG, "Destroying service"); - disconnectAll(true); + disconnectAll(true, false); if (hostdb != null) { hostdb.close(); @@ -199,7 +199,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen /** * Disconnect all currently connected bridges. */ - private void disconnectAll(final boolean immediate) { + private void disconnectAll(final boolean immediate, final boolean excludeLocal) { TerminalBridge[] tmpBridges = null; synchronized (bridges) { @@ -210,8 +210,11 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen if (tmpBridges != null) { // disconnect and dispose of any existing bridges - for (int i = 0; i < tmpBridges.length; i++) + for (int i = 0; i < tmpBridges.length; i++) { + if (excludeLocal && !tmpBridges[i].isUsingNetwork()) + continue; tmpBridges[i].dispatchDisconnect(immediate); + } } } @@ -653,7 +656,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen final Thread t = new Thread() { @Override public void run() { - disconnectAll(false); + disconnectAll(false, true); } }; t.setName("Disconnector"); diff --git a/app/src/main/java/org/connectbot/transport/Telnet.java b/app/src/main/java/org/connectbot/transport/Telnet.java index 16cbd0e..ed8fc95 100644 --- a/app/src/main/java/org/connectbot/transport/Telnet.java +++ b/app/src/main/java/org/connectbot/transport/Telnet.java @@ -20,8 +20,11 @@ package org.connectbot.transport; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketException; +import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.charset.Charset; import java.util.Map; @@ -123,10 +126,24 @@ public class Telnet extends AbsTransport { return PROTOCOL; } + private static void tryAllAddresses(Socket sock, String host, int port) throws IOException { + InetAddress[] addresses = InetAddress.getAllByName(host); + for (InetAddress addr : addresses) { + try { + sock.connect(new InetSocketAddress(addr, port)); + return; + } catch (SocketTimeoutException e) { + } + } + throw new SocketTimeoutException("Could not connect; socket timed out"); + } + @Override public void connect() { try { - socket = new Socket(host.getHostname(), host.getPort()); + socket = new Socket(); + + tryAllAddresses(socket, host.getHostname(), host.getPort()); connected = true; |