]> source.dussan.org Git - tigervnc.git/commitdiff
Poll local socket to make sure SSH tunnel is ready before connecting
authorBrian P. Hinz <bphinz@users.sf.net>
Tue, 5 Nov 2019 01:12:57 +0000 (20:12 -0500)
committerBrian P. Hinz <bphinz@users.sf.net>
Tue, 5 Nov 2019 01:14:53 +0000 (20:14 -0500)
java/com/tigervnc/vncviewer/Tunnel.java

index 9b8af13681a025cd3d59fd326c6c893fc233a977..2d0c61f5bc19324ae820d24fd67f2a27b2a43fa1 100644 (file)
@@ -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) {