Lazarus Pascal
Lazarus Pascal
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 Lazarus Pascal Downloads
program ChilkatDemo;
// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
SysUtils,
CkDllLoader,
Chilkat.Ssh;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
ssh: TSsh;
sshPort: Integer;
password: string;
channelNum: Integer;
numBytes: Integer;
output: string;
begin
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.
ssh := TSsh.Create;
sshPort := 22;
success := ssh.Connect('ssh.example.com',sshPort);
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
// 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.
password := 'mySshPassword';
success := ssh.AuthenticatePw('mySshLogin',password);
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
channelNum := ssh.OpenSessionChannel();
if (channelNum < 0) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
success := ssh.SendReqExec(channelNum,'ls -l /tmp');
if (success = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
// 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
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
// Find out how much is waiting before retrieving it.
numBytes := ssh.GetReceivedNumBytes(channelNum);
if (numBytes < 0) then
begin
WriteLn('Invalid channel, or its resources were already released.');
Exit;
end;
WriteLn('Bytes available: ' + numBytes);
output := ssh.GetReceivedText(channelNum,'utf-8');
if (ssh.LastMethodSuccess = False) then
begin
WriteLn(ssh.LastErrorText);
Exit;
end;
WriteLn(output);
ssh.Disconnect();
ssh.Free;
end;
// ---------------------------------------------------------------------------
begin
try
RunDemo;
except
on E: Exception do
WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
end;
WriteLn;
{$IFDEF MSWINDOWS}
WriteLn('Press Enter to exit...');
ReadLn;
{$ENDIF}
end.