Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) TCP Socket through SSH Tunnel (Port Forwarding)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.
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @iTmp0 int -- Important: Do not use nvarchar(max). See the warning about using nvarchar(max). DECLARE @sTmp0 nvarchar(4000) -- This example requires the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. DECLARE @tunnel int -- Use "Chilkat_9_5_0.Socket" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Socket', @tunnel OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END DECLARE @sshHostname nvarchar(4000) SELECT @sshHostname = 'sftp.example.com' DECLARE @sshPort int SELECT @sshPort = 22 -- Connect to an SSH server and establish the SSH tunnel: DECLARE @success int EXEC sp_OAMethod @tunnel, 'SshOpenTunnel', @success OUT, @sshHostname, @sshPort IF @success <> 1 BEGIN EXEC sp_OAGetProperty @tunnel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @tunnel RETURN END -- Authenticate with the SSH server via a login/password -- or with a public key. -- This example demonstrates SSH password authentication. EXEC sp_OAMethod @tunnel, 'SshAuthenticatePw', @success OUT, 'mySshLogin', 'mySshPassword' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @tunnel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @tunnel RETURN END -- 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 DECLARE @channel int DECLARE @maxWaitMs int SELECT @maxWaitMs = 4000 DECLARE @useTls int SELECT @useTls = 0 EXEC sp_OAMethod @tunnel, 'SshOpenChannel', @channel OUT, 'time-c.nist.gov', 37, @useTls, @maxWaitMs EXEC sp_OAGetProperty @tunnel, 'LastMethodSuccess', @iTmp0 OUT IF @iTmp0 = 0 BEGIN EXEC sp_OAGetProperty @tunnel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @tunnel RETURN END -- 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 -- 1 or 0 to indicate success. If successful, the integer -- is obtained via the ReceivedInt property. DECLARE @bigEndian int SELECT @bigEndian = 1 EXEC sp_OAMethod @channel, 'ReceiveInt32', @success OUT, @bigEndian IF @success <> 1 BEGIN EXEC sp_OAGetProperty @channel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @channel EXEC @hr = sp_OADestroy @tunnel RETURN END DECLARE @dt int -- Use "Chilkat_9_5_0.CkDateTime" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.CkDateTime', @dt OUT EXEC sp_OAGetProperty @channel, 'ReceivedInt', @iTmp0 OUT EXEC sp_OAMethod @dt, 'SetFromNtpTime', @success OUT, @iTmp0 -- Show the current local date/time DECLARE @bLocalTime int SELECT @bLocalTime = 1 EXEC sp_OAMethod @dt, 'GetAsRfc822', @sTmp0 OUT, @bLocalTime PRINT 'Current local date/time: ' + @sTmp0 -- Close the SSH channel. EXEC sp_OAMethod @channel, 'Close', @success OUT, @maxWaitMs IF @success <> 1 BEGIN EXEC sp_OAGetProperty @channel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @channel EXEC @hr = sp_OADestroy @tunnel EXEC @hr = sp_OADestroy @dt RETURN END EXEC @hr = sp_OADestroy @channel -- 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. EXEC sp_OAMethod @tunnel, 'SshOpenChannel', @channel OUT, 'time-a.nist.gov', 37, @useTls, @maxWaitMs EXEC sp_OAGetProperty @tunnel, 'LastMethodSuccess', @iTmp0 OUT IF @iTmp0 = 0 BEGIN EXEC sp_OAGetProperty @tunnel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @tunnel EXEC @hr = sp_OADestroy @dt RETURN END -- Review the LastErrorText to see that the connection was made via the SSH tunnel: EXEC sp_OAGetProperty @tunnel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 -- 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. EXEC sp_OAMethod @channel, 'Close', @success OUT, @maxWaitMs IF @success <> 1 BEGIN EXEC sp_OAGetProperty @channel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @channel EXEC @hr = sp_OADestroy @tunnel EXEC @hr = sp_OADestroy @dt RETURN END EXEC @hr = sp_OADestroy @channel -- Finally, close the SSH tunnel. EXEC sp_OAMethod @tunnel, 'SshCloseTunnel', @success OUT IF @success <> 1 BEGIN EXEC sp_OAGetProperty @tunnel, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @tunnel EXEC @hr = sp_OADestroy @dt RETURN END PRINT 'TCP SSH tunneling example completed.' EXEC @hr = sp_OADestroy @tunnel EXEC @hr = sp_OADestroy @dt END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.