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
(PureBasic) SSH Tunnel (Port Forwarding via direct-tcpip channel)Demonstrates how to create an SSH tunnel to a remote hostname:port via a direct-tcpip channel.
IncludeFile "CkSsh.pb" Procedure ChilkatExample() ; This example assumes the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. ssh.i = CkSsh::ckCreate() If ssh.i = 0 Debug "Failed to create object." ProcedureReturn EndIf ; Connect to an SSH server: hostname.s port.i ; Hostname may be an IP address or hostname: hostname = "192.168.1.117" port = 22 success.i = CkSsh::ckConnect(ssh,hostname,port) If success <> 1 Debug CkSsh::ckLastErrorText(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndIf ; Wait a max of 5 seconds when reading responses.. CkSsh::setCkIdleTimeoutMs(ssh, 5000) ; Authenticate using login/password: success = CkSsh::ckAuthenticatePw(ssh,"chilkat","myPassword") If success <> 1 Debug CkSsh::ckLastErrorText(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndIf ; Open a direct-tcpip channel. We want the SSH server to connect ; to www.chilkatsoft.com, port 80 (i.e. the web server). ; Data sent through the SSH tunnel is forwarded to the remote ; host:port. (Note: The remote host:port does not need to be ; a web server. It can be anything. It can be your own ; customer application server that listens on a port, or any ; other type of server.) ; When we read from the SSH channel, we'll be reading data ; sent from the remote host:port (i.e. the web server in this ; example). channelNum.i channelNum = CkSsh::ckOpenDirectTcpIpChannel(ssh,"www.chilkatsoft.com",80) If channelNum < 0 Debug CkSsh::ckLastErrorText(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndIf ; Build a simple HTTP GET request for http://www.chilkatsoft.com/xyz.html httpReq.s = "GET /xyz123.html HTTP/1.1" + Chr(13) + Chr(10) + "Host: www.chilkatsoft.com" + Chr(13) + Chr(10) + Chr(13) + Chr(10) ; Send the HTTP request: success = CkSsh::ckChannelSendString(ssh,channelNum,httpReq,"ansi") If success <> 1 Debug CkSsh::ckLastErrorText(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndIf ; Get the HTTP response. ; First read the HTTP response header which ends with a double CRLF. ; Calling ChannelReceiveUntilMatch will receive until match string is seen, ; or until a timeout occurs (IdleTimeoutMs property). ChannelReceiveUntilMatch ; may read beyond the match string, but it will stop reading as soon as the match ; string is seen. caseSensitive.i = 0 matchStr.s = Chr(13) + Chr(10) + Chr(13) + Chr(10) success = CkSsh::ckChannelReceiveUntilMatch(ssh,channelNum,matchStr,"ansi",caseSensitive) If success <> 1 Debug CkSsh::ckLastErrorText(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndIf ; Extract the HTTP header from the receive buffer. ; (GetReceiveTextS extracts up to and including the match string from the receive buffer) responseHeader.s responseHeader = CkSsh::ckGetReceivedTextS(ssh,channelNum,matchStr,"ansi") Debug "---- HTTP Response Header ----" Debug responseHeader ; Now get the body of the HTTP response (this is the HTML content ; of http://www.chilkatsoft.com/xyz.html ; It's possible we've already received the entire HTTP response in the ; call to ChannelReceiveUntilMatch. Therefore, we'll poll for any remaining data ; and wait a max of .2 seconds. numBytesRead.i pollTimeoutMs.i = 200 numBytesRead = CkSsh::ckChannelPoll(ssh,channelNum,pollTimeoutMs) ; We're not checking for an error here. ; A return value of -2 means that no data was available and the poll simply timed out (not an error) ; A return value of -1 indicates an error. ; A return value greater than 0 indicates that additional data was received. Debug "---- HTML BODY ----" ; Extract the remainder of the accumulated data in the internal receive buffer. ; This should be our HTML body: htmlBody.s htmlBody = CkSsh::ckGetReceivedText(ssh,channelNum,"ansi") Debug htmlBody ; Close the channel: success = CkSsh::ckChannelSendClose(ssh,channelNum) If success <> 1 Debug CkSsh::ckLastErrorText(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndIf ; Disconnect CkSsh::ckDisconnect(ssh) CkSsh::ckDispose(ssh) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.