Sample code for 30+ languages & platforms
PureBasic

Start an SSH Tunnel Listener (BeginAccepting)

See more SSH Tunnel Examples

Demonstrates the Chilkat SshTunnel.BeginAccepting method, which creates and starts the local listener on the given port. The only argument is the listen port. Connect and authenticate first — clients accepted before authentication cannot be forwarded. The IsAccepting property reports whether the listener is running.

Background: This is the step that actually turns the object into a working tunnel: it spawns a background thread that accepts local TCP connections and forwards each through the authenticated SSH transport. Because the forwarding runs on its own thread, control returns to your program immediately and the tunnel operates while the rest of the application does other work — which is why a separate CloseTunnel is needed to shut it down cleanly.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkSshTunnel.pb"

Procedure ChilkatExample()

    success.i = 0

    ;  Demonstrates the SshTunnel.BeginAccepting method, which creates and starts the local listener
    ;  on the given port.  The only argument is the listen port.  Connect and authenticate first;
    ;  clients accepted before authentication cannot be forwarded.

    tunnel.i = CkSshTunnel::ckCreate()
    If tunnel.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkSshTunnel::setCkDestHostname(tunnel, "db.internal.example.com")
    CkSshTunnel::setCkDestPort(tunnel, 5432)

    sshPort.i = 22
    success = CkSshTunnel::ckConnect(tunnel,"ssh.example.com",sshPort)
    If success = 0
        Debug CkSshTunnel::ckLastErrorText(tunnel)
        CkSshTunnel::ckDispose(tunnel)
        ProcedureReturn
    EndIf

    ;  Normally you would not hard-code the password in source.  You should instead obtain it
    ;  from an interactive prompt, environment variable, or a secrets vault.
    password.s = "mySshPassword"

    success = CkSshTunnel::ckAuthenticatePw(tunnel,"mySshLogin",password)
    If success = 0
        Debug CkSshTunnel::ckLastErrorText(tunnel)
        CkSshTunnel::ckDispose(tunnel)
        ProcedureReturn
    EndIf

    ;  Start the local listener.  Local TCP connections to this port are forwarded to DestHostname:DestPort
    ;  through the SSH server.
    listenPort.i = 1080
    success = CkSshTunnel::ckBeginAccepting(tunnel,listenPort)
    If success = 0
        Debug CkSshTunnel::ckLastErrorText(tunnel)
        CkSshTunnel::ckDispose(tunnel)
        ProcedureReturn
    EndIf

    ;  IsAccepting reports whether the listener thread is running.
    If CkSshTunnel::ckIsAccepting(tunnel)
        Debug "The tunnel is accepting connections on port " + Str(listenPort)
    EndIf

    ;  ... the tunnel forwards traffic on a background thread while your application runs ...

    waitForThreadExit.i = 1
    success = CkSshTunnel::ckCloseTunnel(tunnel,waitForThreadExit)
    If success = 0
        Debug CkSshTunnel::ckLastErrorText(tunnel)
        CkSshTunnel::ckDispose(tunnel)
        ProcedureReturn
    EndIf



    CkSshTunnel::ckDispose(tunnel)


    ProcedureReturn
EndProcedure