Xbase++
Xbase++
Get the Number of Bytes Buffered on an SSH Channel
See more SSH Examples
Demonstrates the Chilkat Ssh.GetReceivedNumBytes method, which returns how many bytes are currently available in a channel's normal receive buffer. The only argument is the channel number. It returns -1 when the channel number is invalid or its retained resources have been released.
Background: This is a non-consuming look at how much is waiting, useful for deciding whether to retrieve now or keep reading, and for reporting progress on a large transfer. It counts only the normal receive buffer — bytes in the separate stderr buffer are excluded when
StderrToStdout is false. Note that data received earlier can remain available even after a disconnect, so a positive count does not imply the connection is still up.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oSsh
LOCAL nSshPort
LOCAL cPassword
LOCAL nChannelNum
LOCAL nNumBytes
LOCAL cOutput
nSuccess := 0
// Demonstrates the Ssh.GetReceivedNumBytes method, which returns the number of bytes currently
// available in a channel's normal receive buffer. The only argument is the channel number.
// It returns -1 for an invalid channel or one whose resources have been released.
oSsh := CreateObject("Chilkat.Ssh")
nSshPort := 22
nSuccess := oSsh:Connect("ssh.example.com", nSshPort)
IF (nSuccess == 0)
? oSsh:LastErrorText
oSsh:destroy()
RETURN
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.
cPassword := "mySshPassword"
nSuccess := oSsh:AuthenticatePw("mySshLogin", cPassword)
IF (nSuccess == 0)
? oSsh:LastErrorText
oSsh:destroy()
RETURN
ENDIF
nChannelNum := oSsh:OpenSessionChannel()
IF (nChannelNum < 0)
? oSsh:LastErrorText
oSsh:destroy()
RETURN
ENDIF
nSuccess := oSsh:SendReqExec(nChannelNum, "ls -l /tmp")
IF (nSuccess == 0)
? oSsh:LastErrorText
oSsh:destroy()
RETURN
ENDIF
// IMPORTANT: Set a read timeout. ReadTimeoutMs defaults to 0, which means no limit -- without
// it, this call waits forever if the server never sends channel close.
oSsh:ReadTimeoutMs := 15000
nSuccess := oSsh:ChannelReceiveToClose(nChannelNum)
IF (nSuccess == 0)
? oSsh:LastErrorText
oSsh:destroy()
RETURN
ENDIF
// Find out how much is waiting before retrieving it.
nNumBytes := oSsh:GetReceivedNumBytes(nChannelNum)
IF (nNumBytes < 0)
? "Invalid channel, or its resources were already released."
oSsh:destroy()
RETURN
ENDIF
? "Bytes available: " + Str(nNumBytes)
cOutput := oSsh:GetReceivedText(nChannelNum, "utf-8")
IF (oSsh:LastMethodSuccess == 0)
? oSsh:LastErrorText
oSsh:destroy()
RETURN
ENDIF
? cOutput
oSsh:Disconnect()
oSsh:destroy()