Visual FoxPro
Visual FoxPro
Poll an SSH Channel for Incoming Data
See more SSH Examples
Demonstrates the Chilkat Ssh.ChannelPoll method, which polls a channel for incoming messages, waiting at most the given number of milliseconds. The first argument is the channel number and the second is the poll timeout; pass 0 for a nonblocking poll.
The integer return value is -1 on error, -2 if nothing arrived before the timeout, 0 if EOF or channel close was processed, or — when greater than 0 — the total bytes currently buffered for the channel (not the bytes newly received by this call).
Background:
ChannelPoll gives you an explicit, per-call wait, which is what an event loop or responsive UI needs — poll briefly, do other work, poll again. Importantly, the timeout you pass governs the wait: shorter ReadTimeoutMs or IdleTimeoutMs values do not cut it short. A -2 return simply means nothing new arrived, which is normal when polling.Chilkat Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL loSsh
LOCAL lnSshPort
LOCAL lcPassword
LOCAL lnChannelNum
LOCAL lnPollTimeoutMs
LOCAL lnResult
LOCAL lcOutput
lnSuccess = 0
* Demonstrates the Ssh.ChannelPoll method, which polls a channel for incoming messages, waiting
* at most the given number of milliseconds. The 1st argument is the channel number and the 2nd
* is the poll timeout. Pass 0 for a nonblocking poll.
loSsh = CreateObject('Chilkat.Ssh')
lnSshPort = 22
lnSuccess = loSsh.Connect("ssh.example.com",lnSshPort)
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
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.
lcPassword = "mySshPassword"
lnSuccess = loSsh.AuthenticatePw("mySshLogin",lcPassword)
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
lnChannelNum = loSsh.OpenSessionChannel()
IF (lnChannelNum < 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Start a shell WITHOUT requesting a PTY. Without a PTY the shell sees it is connected to a
* raw data pipe and enters non-interactive mode: it suppresses the command prompt, does not
* echo typed commands back, and skips interactive login scripts. The output is therefore
* clean and easily parseable -- but because no prompt is ever sent, code must not wait for
* one. Instead, have each command print a predictable marker, or wait for EOF / channel close.
lnSuccess = loSsh.SendReqShell(lnChannelNum)
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
lnSuccess = loSsh.ChannelSendString(lnChannelNum,"date" + CHR(10),"utf-8")
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Wait up to 3 seconds for channel data.
lnPollTimeoutMs = 3000
* The return value is: -1 on error, -2 if nothing arrived before the timeout, 0 if EOF or
* channel close was processed, or the total number of buffered bytes when greater than 0.
lnResult = loSsh.ChannelPoll(lnChannelNum,lnPollTimeoutMs)
IF (lnResult = -1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
IF (lnResult = -2) THEN
? "No channel data arrived before the timeout."
ENDIF
IF (lnResult = 0) THEN
? "EOF or channel close was processed. Buffered data may still remain."
ENDIF
IF (lnResult > 0) THEN
? "Total bytes buffered: " + STR(lnResult)
ENDIF
lcOutput = loSsh.GetReceivedText(lnChannelNum,"utf-8")
IF (loSsh.LastMethodSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
? lcOutput
loSsh.Disconnect()
RELEASE loSsh