From: Brian P. Hinz Date: Tue, 5 Nov 2019 01:12:57 +0000 (-0500) Subject: Poll local socket to make sure SSH tunnel is ready before connecting X-Git-Tag: v1.10.90~94 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=512d940e7e0392993446822b7d67adb9aaf374ca;p=tigervnc.git Poll local socket to make sure SSH tunnel is ready before connecting --- 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) {