Sample code for 30+ languages & platforms
Xojo Plugin

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 Xojo Plugin Downloads

Xojo Plugin
Dim success As Boolean
success = False

//  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.

Dim ssh As New Chilkat.Ssh

Dim sshPort As Int32
sshPort = 22
success = ssh.Connect("ssh.example.com",sshPort)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

//  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.
Dim password As String
password = "mySshPassword"

success = ssh.AuthenticatePw("mySshLogin",password)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

Dim channelNum As Int32
channelNum = ssh.OpenSessionChannel()
If (channelNum < 0) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

success = ssh.SendReqExec(channelNum,"ls -l /tmp")
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

//  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.
ssh.ReadTimeoutMs = 15000

success = ssh.ChannelReceiveToClose(channelNum)
If (success = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

//  Find out how much is waiting before retrieving it.
Dim numBytes As Int32
numBytes = ssh.GetReceivedNumBytes(channelNum)
If (numBytes < 0) Then
    System.DebugLog("Invalid channel, or its resources were already released.")
    Return
End If

System.DebugLog("Bytes available: " + Str(numBytes))

Dim output As String
output = ssh.GetReceivedText(channelNum,"utf-8")
If (ssh.LastMethodSuccess = False) Then
    System.DebugLog(ssh.LastErrorText)
    Return
End If

System.DebugLog(output)

ssh.Disconnect