Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
Check if the SSH Tunnel's Transport is Connected
See more SSH Tunnel Examples
Demonstrates the Chilkat SshTunnel.IsSshConnected method, which returns whether the SSH transport used by the tunnel is connected. It takes no arguments.
Background: A tunnel has two independent parts: the SSH transport to the server and the local listener that accepts connections to forward. This method reports only the first. The distinction matters because the listener can keep accepting local connections even after the SSH transport has dropped — those connections would then fail to forward — so a health check on a long-running tunnel should verify the SSH side explicitly.
Chilkat Pascal (Lazarus/Delphi) 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.SshTunnel;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
tunnel: TSshTunnel;
sshPort: Integer;
password: string;
waitForThreadExit: Boolean;
begin
success := False;
// Demonstrates the SshTunnel.IsSshConnected method, which returns whether the SSH transport used
// by the tunnel is connected. It takes no arguments.
tunnel := TSshTunnel.Create;
// The tunnel forwards accepted local connections to this destination through the SSH server.
tunnel.DestHostname := 'db.internal.example.com';
tunnel.DestPort := 5432;
// Connect to the SSH server. This performs the TCP/proxy connection and SSH handshake, but
// does not authenticate yet.
sshPort := 22;
success := tunnel.Connect('ssh.example.com',sshPort);
if (success = False) then
begin
WriteLn(tunnel.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 := tunnel.AuthenticatePw('mySshLogin',password);
if (success = False) then
begin
WriteLn(tunnel.LastErrorText);
Exit;
end;
// Check whether the SSH transport is connected. This is independent of the local listener
// state -- the listener can still be accepting local connections even when this is False,
// though those connections would fail to forward.
if (tunnel.IsSshConnected()) then
begin
WriteLn('The SSH transport is connected.');
end
else
begin
WriteLn('The SSH transport is not connected.');
end;
waitForThreadExit := True;
success := tunnel.CloseTunnel(waitForThreadExit);
if (success = False) then
begin
WriteLn(tunnel.LastErrorText);
Exit;
end;
tunnel.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.