sgcIndy in fünf Minuten

sgcIndy ist ein gepflegter Build von Indy, kein Fork mit neuen Namen. Die Unit-Namen, die Klassennamen und die Palettenseiten sind die, die du bereits verwendest, der Schnellstart lautet also nicht „schreibe diesen Code“, sondern „installiere es, baue neu und setze dann eine neue Eigenschaft“.

Dieselben Unit- und Klassennamen wie Indy
OpenSSL 1.0, 1.1 und 3.0, mit TLS 1.3
Delphi, C++Builder, FreePascal und Lazarus

Die Tatsache, die alles andere prägt

Es gibt kein sgcId-Präfix. Keine einzige Unit, keine einzige Klasse. Dein bestehender Code kompiliert unverändert.

Unit-Namen

Schlichte Indy-Namen. IdTCPClient, IdHTTP, IdSSLOpenSSL und rund vierhundert weitere. Keine Unit der Bibliothek trägt ein sgc-Präfix.

Klassennamen

Ebenfalls schlichte Indy-Namen: TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL, TIdSSHClient, TIdSFTPClient.

Palettenseiten

Dieselben fünf: Indy Clients, Indy Servers, Indy Intercepts, Indy I/O Handlers und Indy Misc. Rund 166 Komponenten darauf, an den Stellen, an denen du bereits suchst.

Was sich also ändert

Der Installer tauscht aus, welche Pakete die IDE lädt, und schreibt den Suchpfad um. Dein Projekt ändert sich nicht. Der sichtbare Unterschied ist eine neue Eigenschaft, SSLOptions.APIVersion, und die Korrekturen darunter.

Voraussetzungen und Editionen

sgcIndy hat keine Funktionsstufen. Die Lizenzstufen ändern, was in der Box liegt, nicht was der Code kann.

Was Wert
IDE Delphi 7 bis RAD Studio 13 sowie C++Builder 2007 bis 13. Für jede gibt es Paketgruppen.
Uses-Klausel Unverändert. Was dein Projekt bereits schreibt, funktioniert weiter, denn die Unit-Namen sind mit dem Standard-Indy identisch.
Indy-Basisversion Die Bibliothek meldet sich als Indy 10.6.3.12. Die sgc-Änderungen sind mit Kommentaren und bedingten Defines innerhalb der Original-Units markiert, nicht durch Umbenennen.
Editionen Keine Funktionsstufen. Das Editions-Flag wird zur Build-Zeit eingefügt und hat genau zwei Verbraucher, das Info-Fenster und den IDE-Splash-Screen. Nichts in der Bibliothek wird dadurch gesteuert. Was die Stufen tatsächlich ändern, ist die Paketierung: Die Builds Community und Basic liefern kompilierte Binärdateien aus, bei denen die Dateien .pas und .inc ausgeschlossen sind, während der Quellcode-Build sie enthält.
FreePascal und Lazarus Unterstützt. Ein Lazarus-Paket liegt bei, zusammen mit den FreePascal-Paket-Stubs und Build-Dateien, und die Compiler-Staffel reicht von FPC 2.2.2 bis 3.3.1. Eine Einschränkung: Der Delphi-Modus ist für Lazarus absichtlich deaktiviert, eine Unit, die ihn voraussetzt, muss also angepasst werden.
Plattformen Windows, Linux, macOS, FreeBSD, iOS und Android haben alle ihre eigenen bedingten Blöcke. Unter iOS muss OpenSSL statisch gelinkt werden.

Das Nützlichste, was du vor dem Start wissen solltest: Weil die Unit-Namen mit dem in RAD Studio mitgelieferten Indy kollidieren, übernimmt der Installer den Austausch für dich. Er hebt die Registrierung der integrierten Indy-Entwurfszeitpakete auf, registriert seine eigenen und schreibt die Suchpfade der IDE um.

Installieren und den Austausch bestätigen

Der Installer erledigt die Arbeit. Wichtig ist zu bestätigen, dass die IDE danach tatsächlich sgcIndy lädt.

1. Den Installer ausführen

Starte das heruntergeladene Setup und hake die RAD-Studio-Versionen und Plattformen an, die du willst. Er kopiert die Bibliothek und lässt bei den Paketen Community und Basic die Quelldateien weg.

2. Ihn die Pakete tauschen lassen

Der Installer hebt die Registrierung der integrierten Indy-Entwurfszeitpakete der IDE auf und registriert seine eigenen an ihrer Stelle. Dadurch werden dieselben Unit-Namen zu sgcIndy aufgelöst.

3. Ihn den Suchpfad korrigieren lassen

Er setzt die sgcIndy-Ordner für jede Plattform an den Anfang der IDE-Suchpfade und entfernt veraltete Einträge einer früheren Installation.

4. Am Splash-Screen bestätigen

Starte die IDE neu. Der Splash-Screen nennt sgcIndy, und das Indy-Info-Fenster sagt es ebenfalls. Das ist die Prüfung, dass der Austausch gegriffen hat.

5. Dein Projekt neu bauen

Öffne dein bestehendes Indy-Projekt und baue es neu. Fasse die Uses-Klausel nicht an. Wenn es mit dem Standard-Indy kompiliert hat, kompiliert es auch hiermit.

Neu bauen, dann TLS 1.3 erreichen

Der erste Tab zeigt, wie dein bestehendes Projekt bereits aussieht. Der zweite ist die eine neue Zeile, die sich lohnt. Der dritte belegt, dass du auf sgcIndy bist und nicht auf dem Standard-Indy.

FHttpClient.pas
// This is a shipped sgcIndy demo's uses clause.
// Read it twice: there is not one sgc prefix in it.
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL, IdSSLOpenSSLHeaders, StdCtrls;

Dein bestehendes Projekt sieht bereits so aus, und das ist der Punkt. Es gibt kein sgcIdTCPClient und kein TsgcIdSSLIOHandlerSocketOpenSSL, denn keine Unit und keine Klasse der Bibliothek trägt ein sgc-Präfix. Installieren, neu bauen, fertig.

FHttpClient.pas
procedure TFRMHttpClient.btnGoToClick(Sender: TObject);
var
  oStream: TStringStream;
begin
  // Two separate settings. APIVersion picks which generation of the
  // OpenSSL API to call, Method picks the TLS version. TLS 1.3 needs
  // the 3.0 API, so both lines change together.
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;

  oStream := TStringStream.Create('');
  try
    IdHTTP1.Get(txtURL.Text, oStream);
  finally
    FreeAndNil(oStream);
  end;
end;

TIdSSLAPIVersion hat die Member sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 und sslvAPI_3_0. Weder der Typ noch die Eigenschaft existiert im Standard-Indy, was dieses Snippet zu einem Beleg zur Kompilierzeit macht, gegen welche Bibliothek du baust.

fTcpClient.pas
procedure TfrmTCPClient.btnConnectClick(Sender: TObject);
begin
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;

  IdTCPClient1.Host := txtHost.Text;
  IdTCPClient1.Port := StrToInt(txtPort.Text);
  IdSSLIOHandlerSocketOpenSSL1.PassThrough := False;

  IdTCPClient1.Connect;
end;

procedure TfrmTCPClient.btnDisconnectClick(Sender: TObject);
begin
  IdTCPClient1.Disconnect;
end;

Dieselben Komponenten, dieselben Eigenschaften, dieselbe Palettenseite. PassThrough := False verwandelt den einfachen Socket in einen TLS-Socket, genau wie im Standard-Indy. Gelesen wird mit IdTCPClient1.IOHandler.ReadLn, geschrieben mit IOHandler.Write, unverändert.

Die ersten beiden Tabs stammen aus der mitgelieferten Demo Demos\HttpClient\FHttpClient.pas, wobei die Combobox durch ein Literal ersetzt wurde. Insgesamt liegen achtzehn Demos bei, darunter SSH- und SFTP-Clients, ein FTP-Client, Mail-Clients, ein TCP-Server und ein UDP-Paar.

Belegen, dass du sgcIndy ausführst

Weil die Unit-Namen identisch sind, erkennst du es nicht am eigenen Quelltext. Hier sind drei eindeutige Prüfungen.

Der Splash-Screen

Starte die IDE nach der Installation neu. Der Splash-Screen nennt sgcIndy. Das ist die Prüfung, dass der Paketaustausch gegriffen hat, und die schnellste.

Das Info-Fenster

Der Indy-Info-Dialog nennt eSeGeCe statt des Standardtexts und sagt beim kostenlosen Paket Community Edition.

Eine Zeile, die sich gegen das Standard-Indy nicht kompilieren lässt

SSLOptions.APIVersion := sslvAPI_3_0;. Der Typ TIdSSLAPIVersion existiert im Standard-Indy nicht, wenn diese Zeile also baut, bist du auf sgcIndy.

Dein eigenes Projekt

Baue es neu, ohne die Uses-Klausel anzufassen. Es sollte genau wie vorher kompilieren, weil die Unit- und Klassennamen identisch sind.

Was beim ersten Mal meistens schiefgeht

Sechs Probleme erklären fast jede Migration.

Du hast nach sgcId-Units gesucht

Es gibt keine. Null Units und null Klassen der Bibliothek tragen ein sgc-Präfix. Wenn du deine Uses-Klausel auf sgcIdTCPClient umschreibst, kompiliert das Projekt nicht, weil es keine solche Unit gibt.

Die IDE lädt weiterhin das Standard-Indy

Der Installer übernimmt den Paketaustausch, das bedeutet daher meist, dass die Installation nicht abgeschlossen wurde oder ein manueller Suchpfad-Eintrag Vorrang hat. Prüfe den Splash-Screen, der sgcIndy nennt, wenn der Austausch gegriffen hat.

TLS 1.3 wird nicht ausgehandelt

Setze beide Eigenschaften. SSLOptions.APIVersion wählt die zu verwendende OpenSSL-API-Generation, und SSLOptions.Method wählt die Protokollversion. TLS 1.3 braucht die 3.0-API, daher müssen sich beide Zeilen gemeinsam ändern.

Die OpenSSL-DLLs fehlen

Jeder Demo-Ordner enthält den Satz, den er braucht, neben der ausführbaren Datei. Für die 3.0-API sind das libcrypto-3.dll und libssl-3.dll. Bei den älteren APIs lauten die Namen anders, und das Kopieren des falschen Paars ist eine häufige Ursache für einen Handshake, der scheitert, bevor er beginnt.

Eine Unit schlägt unter Lazarus fehl

Der Delphi-Modus ist in den Compiler-Defines für Lazarus-Builds absichtlich ausgeschaltet, mit einem Kommentar, dass er dort fehlschlägt. Code, der sich auf die Semantik des Delphi-Modus stützt, muss angepasst werden.

Die Quelldateien fehlen im Paket

Die Installer Community und Basic liefern kompilierte Binärdateien aus und schließen die Dateien .pas und .inc aus. Wenn du in die Bibliothek hineinsteppen musst, brauchst du das Paket, das den Quellcode enthält.

Was sgcIndy über Indy hinaus ergänzt

Vier Dinge, die du nach dem Neubau kennen solltest.

Modernes OpenSSL und TLS 1.3

Das Standard-Indy 10.6.2 stammt aus der Zeit vor den OpenSSL-API-Änderungen von 1.1 und 3.0. SSLOptions.APIVersion wählt die Generation, und sslvTLSv1_3 wird mit der 3.0-API erreichbar.

sgcIndy-Funktionen

SSH und SFTP

TIdSSHClient und TIdSFTPClient gibt es im Standard-Indy überhaupt nicht. Für beide liegen Demos bei.

SSH-Client und SFTP-Client

Hochleistungs-Server

Die IO-Handler IOCP und epoll ersetzen unter Windows und Linux das Modell mit einem Thread pro Verbindung, was die Form eines Servers unter echter Last verändert.

Der Vergleich

Moderne Authentifizierung für Mail

Die Unterstützung von XOAUTH2 bedeutet, dass sich ein SMTP- oder IMAP-Client bei Anbietern authentifizieren kann, die die Basic-Authentifizierung abgeschafft haben.

XOAUTH2 in sgcIndy

Referenz, Demos und Dokumentation

Achtzehn Demo-Projekte liegen im Download bei, von einem Echo-Client bis zu SSH und SFTP.

sgcIndy-Funktionen Was dieser Build gegenüber Indy 10.6.3 korrigiert und ergänzt.
Der Vergleich sgcIndy gegenüber dem Standard-Indy, Funktion für Funktion.
Download Das Community-Paket ist kostenlos nutzbar.
Bestellen Die Pakete, die den vollständigen Quellcode enthalten.
Produktübersicht Was sgcIndy ist und für wen es gedacht ist.
Alle Produkte Die Preise jeder eSeGeCe-Bibliothek in einer Tabelle.

Zum Weiterlesen: OpenSSL 3.0 mit Indy, der IOCP-Server, der SSH-Client und die aktuellen Release Notes. Jedes Produkt hat einen eigenen Schnellstart, aufgelistet auf der Seite Erste Schritte.

Fragen zum sgcIndy-Schnellstart

Nein, und das ist das Wichtigste an sgcIndy überhaupt. Jede Unit behält ihren ursprünglichen Indy-Namen, IdTCPClient, IdHTTP, IdSSLOpenSSL und den Rest, und jede Klasse behält ihren ursprünglichen Namen, TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL. Nirgends in der Bibliothek gibt es eine Unit oder Klasse mit sgc-Präfix. Installiere es, baue neu, und dein Projekt ist auf sgcIndy.
Der Installer tauscht sie aus. Er hebt die Registrierung der integrierten Indy-Entwurfszeitpakete in der IDE auf, registriert stattdessen die von sgcIndy und setzt die sgcIndy-Ordner an den Anfang der Suchpfade. Weil die Unit-Namen identisch sind, muss sich genau das ändern und nicht dein Code.
Drei Prüfungen. Der IDE-Splash-Screen nennt beim Start sgcIndy. Das Indy-Info-Fenster sagt es ebenfalls. Und es gibt einen Beleg zur Kompilierzeit: SSLOptions.APIVersion existiert nur in diesem Build, eine Zeile, die ihr sslvAPI_3_0 zuweist, kompiliert hier und scheitert gegen das Standard-Indy.
Zwei Eigenschaften, gemeinsam gesetzt. SSLOptions.APIVersion := sslvAPI_3_0 wählt die OpenSSL-3.0-API-Generation, und SSLOptions.Method := sslvTLSv1_3 wählt das Protokoll. Der Typ TIdSSLAPIVersion hat die Member sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 und sslvAPI_3_0, und TIdSSLVersion hat sslvTLSv1_3 dazubekommen. Liefere dann libcrypto-3.dll und libssl-3.dll neben deiner ausführbaren Datei aus, wie es die Demos tun.
Die Bibliothek meldet sich als Indy 10.6.3.12. Die sgc-Änderungen sind innerhalb der Originaldateien vorgenommen, mit Kommentaren markiert und durch bedingte Defines abgesichert, und genau deshalb konnten die Unit-Namen gleich bleiben.
Keine, denn keine Funktion wird nach Edition gesteuert. Das Editions-Flag wird zur Build-Zeit eingefügt und hat in der gesamten Bibliothek nur zwei Verbraucher, beide kosmetisch: die Beschriftung des Info-Fensters und den Text des IDE-Splash-Screens. Was die Stufen tatsächlich ändern, ist die Paketierung, denn die Installer Community und Basic liefern kompilierte Binärdateien aus und schließen die Dateien .pas und .inc aus, während das Paket mit Quellcode sie enthält.
Ja. Ein Lazarus-Paket liegt bei, zusammen mit den FreePascal-Paket-Stubs und Build-Dateien, und die Compiler-Staffel reicht von FPC 2.2.2 bis 3.3.1. Eine Einschränkung solltest du vor dem Start kennen: Der Delphi-Modus ist in den Compiler-Defines für Lazarus absichtlich deaktiviert, mit einem Kommentar, dass er dort fehlschlägt, eine Unit, die von der Semantik des Delphi-Modus abhängt, muss also angepasst werden.
Windows, Linux, macOS, FreeBSD, iOS und Android haben alle ihre eigenen bedingten Blöcke in den Compiler-Defines. Unix-Ziele verwenden OpenSSL und die mitgelieferte zlib-Unit. iOS ist das Ziel mit einer echten Einschränkung: OpenSSL muss dort statisch gelinkt werden, statt zur Laufzeit geladen zu werden.
Bestes Preis-Leistungs-Verhältnis: All-AccessAlle eSeGeCe-Produkte, inklusive Premium-Support, ab €1,059 pro Jahr.
All-Access-Preise ansehen

Bereit, das Standard-Indy hinter dir zu lassen?

Das Community-Paket ist kostenlos. Installiere es, baue neu und prüfe den Splash-Screen.