Sample code for 30+ languages & platforms
AutoIt Requires Chilkat v11.0.0+

TCP Socket through SSH Tunnel (Port Forwarding)

See more Socket/SSL/TLS Examples

Demonstrates using Chilkat Socket to communicate to a TCP service through an SSH tunnel. This example will connect to an NIST time server and (using the old Time Protocol (RFC 868)), will read the current GMT time.

Note: This is not necessarily a recommended means for getting the current date/time. The most commonly used time protocol is the Network Time Protocol (RFC-1305). The intent of this example is to show how TCP communications can occur through an SSH tunnel.

Chilkat AutoIt Downloads

AutoIt
Local $bSuccess = False

;  This example requires the Chilkat API to have been previously unlocked.
;  See Global Unlock Sample for sample code.

$oTunnel = ObjCreate("Chilkat.Socket")

Local $sshHostname = "sftp.example.com"
Local $iSshPort = 22

;  Connect to an SSH server and establish the SSH tunnel:
$bSuccess = $oTunnel.SshOpenTunnel($sshHostname,$iSshPort)
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
EndIf

;  Authenticate with the SSH server via a login/password
;  or with a public key.
;  This example demonstrates SSH password authentication.
$bSuccess = $oTunnel.SshAuthenticatePw("mySshLogin","mySshPassword")
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
EndIf

;  OK, the SSH tunnel is setup.  Now open a channel within the tunnel.
;  Once the channel is obtained, the Socket API may
;  be used exactly the same as usual, except all communications
;  are sent through the channel in the SSH tunnel.
;  Any number of channels may be created from the same SSH tunnel.
;  Multiple channels may coexist at the same time.

;  Connect to an NIST time server and read the current date/time
Local $iMaxWaitMs = 4000
Local $bUseTls = False
$oChannel = ObjCreate("Chilkat.Socket")
$bSuccess = $oTunnel.SshNewChannel("time-c.nist.gov",37,$bUseTls,$iMaxWaitMs,$oChannel)
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
EndIf

;  The time server will send a big-endian 32-bit integer representing
;  the number of seconds since since 00:00 (midnight) 1 January 1900 GMT.
;  The ReceiveInt32 method will receive a 4-byte integer, but returns
;  True or False to indicate success.  If successful, the integer
;  is obtained via the ReceivedInt property.
Local $bigEndian = True
$bSuccess = $oChannel.ReceiveInt32($bigEndian)
If ($bSuccess = False) Then
    ConsoleWrite($oChannel.LastErrorText & @CRLF)
    Exit
EndIf

$oDt = ObjCreate("Chilkat.CkDateTime")
$oDt.SetFromNtpTime($oChannel.ReceivedInt)

;  Show the current local date/time
Local $bLocalTime = True
ConsoleWrite("Current local date/time: " & $oDt.GetAsRfc822($bLocalTime) & @CRLF)

;  Close the SSH channel.
$bSuccess = $oChannel.Close($iMaxWaitMs)
If ($bSuccess <> True) Then
    ConsoleWrite($oChannel.LastErrorText & @CRLF)
    Exit
EndIf

;  It is possible to create a new channel from the existing SSH tunnel for the next connection:
;  Any number of channels may be created from the same SSH tunnel.
;  Multiple channels may coexist at the same time.
$bSuccess = $oTunnel.SshNewChannel("time-a.nist.gov",37,$bUseTls,$iMaxWaitMs,$oChannel)
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
EndIf

;  Review the LastErrorText to see that the connection was made via the SSH tunnel:
ConsoleWrite($oTunnel.LastErrorText & @CRLF)

;  Close the connection to time-a.nist.gov.  This is actually closing our channel
;  within the SSH tunnel, but keeps the tunnel open for the next port-forwarded connection.
$bSuccess = $oChannel.Close($iMaxWaitMs)
If ($bSuccess <> True) Then
    ConsoleWrite($oChannel.LastErrorText & @CRLF)
    Exit
EndIf

;  Finally, close the SSH tunnel.
$bSuccess = $oTunnel.SshCloseTunnel()
If ($bSuccess = False) Then
    ConsoleWrite($oTunnel.LastErrorText & @CRLF)
    Exit
EndIf

ConsoleWrite("TCP SSH tunneling example completed." & @CRLF)