aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian P. Hinz <bphinz@users.sf.net>2019-11-04 20:12:57 -0500
committerBrian P. Hinz <bphinz@users.sf.net>2019-11-04 20:14:34 -0500
commit9ab28ef32da019441821ddac68cda77075a8a371 (patch)
treea7ef86713d69ad4fd566593ddfcb73b1ab8c9785
parent7e32921c65fac9c6626038c1e5c52ffd8d5665a0 (diff)
downloadtigervnc-9ab28ef32da019441821ddac68cda77075a8a371.tar.gz
tigervnc-9ab28ef32da019441821ddac68cda77075a8a371.zip
Poll local socket to make sure SSH tunnel is ready before connecting
-rw-r--r--java/com/tigervnc/vncviewer/Tunnel.java31
1 files changed, 29 insertions, 2 deletions
diff --git a/java/com/tigervnc/vncviewer/Tunnel.java b/java/com/tigervnc/vncviewer/Tunnel.java
index 9b8af136..2d0c61f5 100644
--- a/java/com/tigervnc/vncviewer/Tunnel.java
+++ b/java/com/tigervnc/vncviewer/Tunnel.java
@@ -29,6 +29,8 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.IOException;
+import java.net.*;
import java.util.*;
import com.tigervnc.rdr.*;
@@ -209,13 +211,38 @@ public class Tunnel {
try {
Thread t = new Thread(new ExtProcess(cmd, vlog, true));
t.start();
- // wait for the ssh process to start
- Thread.sleep(1000);
+ // try for up to 5s
+ for (int i=0;i<50;i++) {
+ if (isTunnelReady(localPort))
+ return;
+ else
+ Thread.sleep(100);
+ }
+ throw new Exception("SSH Tunnel not ready");
} catch (java.lang.Exception e) {
throw new Exception(e.getMessage());
}
}
+ private static boolean isTunnelReady(int localPort) throws Exception {
+ // test the local forwarding socket to make
+ // sure the tunnel is up before connecting
+ SocketAddress sockAddr =
+ new InetSocketAddress("localhost", localPort);
+ java.net.Socket socket = new java.net.Socket();
+ boolean ready = false;
+ try {
+ socket.connect(sockAddr);
+ ready = socket.isConnected();
+ socket.close();
+ } catch (IOException e) {
+ // expected until tunnel is up
+ } catch (java.lang.Exception e) {
+ throw new Exception(e.getMessage());
+ }
+ return ready;
+ }
+
private static String fillCmdPattern(String pattern, String gatewayHost,
String remoteHost, int remotePort,
int localPort) {