Sample code for 30+ languages & platforms
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

Visual FoxPro
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