sgcIndy in vijf minuten

sgcIndy is een onderhouden build van Indy, geen fork met nieuwe namen. De unitnamen, de klassenamen en de palettabpagina's zijn degene die je al gebruikt, dus de snelstart is niet "schrijf deze code", maar "installeer het, bouw opnieuw en stel dan één nieuwe eigenschap in".

Dezelfde unit- en klassenamen als Indy
OpenSSL 1.0, 1.1 en 3.0, met TLS 1.3
Delphi, C++Builder, FreePascal en Lazarus

Het feit dat al het andere bepaalt

Er is geen sgcId-voorvoegsel. Geen enkele unit, geen enkele klasse. Je bestaande code compileert ongewijzigd.

Unitnamen

Gewone Indy-namen. IdTCPClient, IdHTTP, IdSSLOpenSSL en ongeveer vierhonderd meer. Geen enkele unit in de bibliotheek heeft een sgc-voorvoegsel in de naam.

Klassenamen

Ook gewone Indy-namen: TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL, TIdSSHClient, TIdSFTPClient.

Palettabpagina's

Dezelfde vijf: Indy Clients, Indy Servers, Indy Intercepts, Indy I/O Handlers en Indy Misc. Ongeveer 166 componenten verdeeld over die pagina's, op de plekken waar je al kijkt.

Wat verandert er dan

Het installatieprogramma wisselt welke packages de IDE laadt en herschrijft het zoekpad. Je project verandert niet. Het zichtbare verschil is een nieuwe eigenschap, SSLOptions.APIVersion, en de fixes eronder.

Vereisten en edities

sgcIndy heeft geen functieniveaus. De licentieniveaus veranderen wat er in het pakket zit, niet wat de code kan.

Onderdeel Waarde
IDE Delphi 7 tot en met RAD Studio 13 en C++Builder 2007 tot en met 13. Voor elk worden packagegroepen meegeleverd.
Uses-clausule Ongewijzigd. Wat je project al schrijft blijft werken, omdat de unitnamen identiek zijn aan die van standaard Indy.
Indy-basisversie De bibliotheek meldt zichzelf als Indy 10.6.3.12. De sgc-wijzigingen zijn gemarkeerd met opmerkingen en voorwaardelijke defines in de originele units, niet door ze een andere naam te geven.
Edities Geen functieniveaus. De editievlag wordt tijdens het bouwen geïnjecteerd en heeft precies twee gebruikers: het About-venster en het splashscherm van de IDE. Niets in de bibliotheek wordt erdoor afgeschermd. Wat de niveaus echt veranderen, is de verpakking: de Community- en Basic-builds leveren gecompileerde binaries mee zonder de .pas- en .inc-bestanden, terwijl de build met broncode ze wel bevat.
FreePascal en Lazarus Ondersteund. Er wordt een Lazarus-package meegeleverd, samen met de FreePascal-packagestubs en buildbestanden, en de compilerladder dekt FPC 2.2.2 tot 3.3.1. Eén kanttekening: de Delphi-modus is voor Lazarus bewust uitgeschakeld, dus een unit die ervan uitgaat, moet worden aangepast.
Platforms Windows, Linux, macOS, FreeBSD, iOS en Android hebben allemaal hun eigen voorwaardelijke blokken. Op iOS moet OpenSSL statisch worden gelinkt.

Het nuttigste om te weten voordat je begint: omdat de unitnamen botsen met de Indy die met RAD Studio wordt meegeleverd, regelt het installatieprogramma de wissel voor je. Het heft de registratie van de ingebouwde Indy-designpackages op, registreert die van zichzelf en herschrijft de zoekpaden van de IDE.

Installeer en controleer de wissel

Het installatieprogramma doet het werk. Wat telt, is achteraf controleren dat de IDE echt sgcIndy laadt.

1. Voer het installatieprogramma uit

Voer de gedownloade setup uit en vink de RAD Studio-versies en platforms aan die je wilt. Het kopieert de bibliotheek en laat voor de Community- en Basic-packages de bronbestanden weg.

2. Laat het de packages wisselen

Het installatieprogramma heft de registratie van de ingebouwde Indy-designpackages van de IDE op en registreert zijn eigen packages in hun plaats. Hierdoor worden dezelfde unitnamen naar sgcIndy omgezet.

3. Laat het het zoekpad herstellen

Het zet de sgcIndy-mappen vooraan in de zoekpaden van de IDE voor elk platform en verwijdert verouderde items van een eerdere installatie.

4. Controleer op het splashscherm

Herstart de IDE. Het splashscherm noemt sgcIndy en het Indy About-venster zegt dat ook. Dat is de controle dat de wissel is gelukt.

5. Bouw je project opnieuw

Open je bestaande Indy-project en bouw opnieuw. Raak de uses-clausule niet aan. Als het compileerde met standaard Indy, compileert het hiermee.

Opnieuw bouwen en dan TLS 1.3 bereiken

Het eerste tabblad is hoe je bestaande project er al uitziet. Het tweede is de ene nieuwe regel die het waard is om toe te voegen. Het derde bewijst dat je op sgcIndy zit en niet op standaard 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;

Je bestaande project ziet er al zo uit, en dat is de bedoeling. Er is geen sgcIdTCPClient en geen TsgcIdSSLIOHandlerSocketOpenSSL, omdat geen enkele unit en geen enkele klasse in de bibliotheek een sgc-voorvoegsel heeft. Installeren, opnieuw bouwen, klaar.

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 heeft de leden sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 en sslvAPI_3_0. Noch het type, noch de eigenschap bestaat in standaard Indy, waardoor dit fragment een compileertijdbewijs is van tegen welke bibliotheek je bouwt.

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;

Dezelfde componenten, dezelfde eigenschappen, dezelfde palettabpagina. PassThrough := False maakt van de gewone socket een TLS-socket, precies zoals in standaard Indy. Lezen is IdTCPClient1.IOHandler.ReadLn, schrijven is IOHandler.Write, ongewijzigd.

De eerste twee tabbladen komen uit de meegeleverde demo Demos\HttpClient\FHttpClient.pas, met de combobox vervangen door een literal. In totaal worden achttien demo's meegeleverd, waaronder SSH- en SFTP-clients, een FTP-client, mailclients, een TCP-server en een UDP-paar.

Bewijs dat je sgcIndy draait

Omdat de unitnamen identiek zijn, kun je het niet aan je eigen broncode zien. Hier zijn drie controles die ondubbelzinnig zijn.

Het splashscherm

Herstart de IDE na het installeren. Het splashscherm noemt sgcIndy. Dat is de controle dat de packagewissel is gelukt en het is de snelste.

Het About-venster

Het Indy About-dialoogvenster meldt eSeGeCe in plaats van de standaardtekst en vermeldt Community Edition op het gratis package.

Een regel die niet compileert met standaard Indy

SSLOptions.APIVersion := sslvAPI_3_0;. Het type TIdSSLAPIVersion bestaat niet in standaard Indy, dus als die regel bouwt, zit je op sgcIndy.

Je eigen project

Bouw het opnieuw zonder de uses-clausule aan te raken. Het moet precies zo compileren als voorheen, omdat de unit- en klassenamen identiek zijn.

Wat er de eerste keer meestal misgaat

Zes problemen verklaren bijna elke migratie.

Je zocht naar sgcId-units

Die zijn er niet. Nul units en nul klassen in de bibliotheek hebben een sgc-voorvoegsel. Als je je uses-clausule herschrijft naar sgcIdTCPClient, compileert het project niet, omdat zo'n unit niet bestaat.

De IDE laadt nog steeds standaard Indy

Het installatieprogramma regelt de packagewissel, dus dit betekent meestal dat de installatie niet is voltooid of dat een handmatig zoekpaditem voorrang krijgt. Controleer het splashscherm, dat sgcIndy noemt wanneer de wissel is gelukt.

TLS 1.3 wordt niet onderhandeld

Stel beide eigenschappen in. SSLOptions.APIVersion selecteert welke OpenSSL-API-generatie wordt gebruikt en SSLOptions.Method selecteert de protocolversie. TLS 1.3 heeft de 3.0-API nodig, dus beide regels moeten samen veranderen.

De OpenSSL-DLL's ontbreken

Elke demomap bevat de set die nodig is naast het uitvoerbare bestand. Voor de 3.0-API zijn dat libcrypto-3.dll en libssl-3.dll. Voor de oudere API's zijn de namen anders en het kopiëren van het verkeerde paar is een veelvoorkomende oorzaak van een handshake die mislukt voordat die begint.

Een unit mislukt onder Lazarus

De Delphi-modus is voor Lazarus-builds bewust uitgeschakeld in de compilerdefines, met een opmerking dat het daar mislukt. Code die afhankelijk is van Delphi-modussemantiek moet worden aangepast.

De bronbestanden zitten niet in het package

De Community- en Basic-installatieprogramma's leveren gecompileerde binaries mee en sluiten de .pas- en .inc-bestanden uit. Als je in de bibliotheek wilt debuggen, heb je het package met broncode nodig.

Wat sgcIndy toevoegt aan Indy

Vier dingen die het waard zijn om te weten zodra het opnieuw bouwen klaar is.

Moderne OpenSSL en TLS 1.3

Standaard Indy 10.6.2 dateert van vóór de API-wijzigingen van OpenSSL 1.1 en 3.0. SSLOptions.APIVersion selecteert de generatie en sslvTLSv1_3 wordt bereikbaar op de 3.0-API.

sgcIndy-functies

SSH en SFTP

TIdSSHClient en TIdSFTPClient zitten helemaal niet in standaard Indy. Voor beide worden demo's meegeleverd.

SSH-client en SFTP-client

Krachtige servers

De IOCP- en epoll-IO-handlers vervangen het thread-per-verbinding-model op Windows en Linux, en dat verandert de vorm van een server onder echte belasting.

Hoe het zich verhoudt

Moderne authenticatie voor e-mail

Dankzij XOAUTH2-ondersteuning kan een SMTP- of IMAP-client zich authenticeren bij providers die basisauthenticatie hebben stopgezet.

XOAUTH2 in sgcIndy

Referentie, demo's en documentatie

Achttien demoprojecten zitten in de download, van een echoclient tot SSH en SFTP.

sgcIndy-functies Wat deze build repareert en toevoegt aan Indy 10.6.3.
Hoe het zich verhoudt sgcIndy tegenover standaard Indy, functie voor functie.
Download Het Community-package is gratis te gebruiken.
Bestellen De packages met volledige broncode.
Productoverzicht Wat sgcIndy is en voor wie het bedoeld is.
Alle producten Prijzen van elke eSeGeCe-bibliotheek in één tabel.

Verder lezen: OpenSSL 3.0 met Indy, de IOCP-server, de SSH-client en de laatste releasenotities. Elk product heeft zijn eigen snelstart, te vinden op de pagina Aan de slag.

Vragen over de sgcIndy-snelstart

Nee, en dit is het allerbelangrijkste over sgcIndy. Elke unit behoudt zijn oorspronkelijke Indy-naam, IdTCPClient, IdHTTP, IdSSLOpenSSL en de rest, en elke klasse behoudt zijn oorspronkelijke naam, TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL. Nergens in de bibliotheek is een unit of klasse met een sgc-voorvoegsel. Installeer het, bouw opnieuw en je project draait op sgcIndy.
Het installatieprogramma wisselt ze. Het heft de registratie van de ingebouwde Indy-designpackages in de IDE op, registreert die van sgcIndy in hun plaats en zet de sgcIndy-mappen vooraan in de zoekpaden. Omdat de unitnamen identiek zijn, is dat wat moet veranderen en niet je code.
Drie controles. Het splashscherm van de IDE noemt sgcIndy bij het opstarten. Het Indy About-venster zegt dat ook. En er is een compileertijdbewijs: SSLOptions.APIVersion bestaat alleen in deze build, dus een regel die er sslvAPI_3_0 aan toewijst, compileert hier en mislukt met standaard Indy.
Twee eigenschappen, samen ingesteld. SSLOptions.APIVersion := sslvAPI_3_0 selecteert de OpenSSL 3.0-API-generatie en SSLOptions.Method := sslvTLSv1_3 selecteert het protocol. Het type TIdSSLAPIVersion heeft de leden sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 en sslvAPI_3_0 en TIdSSLVersion heeft sslvTLSv1_3 erbij gekregen. Lever daarna libcrypto-3.dll en libssl-3.dll mee naast je uitvoerbare bestand, zoals de demo's doen.
De bibliotheek meldt zichzelf als Indy 10.6.3.12. De sgc-wijzigingen worden in de originele bestanden aangebracht, gemarkeerd met opmerkingen en beveiligd door voorwaardelijke defines, en daarom konden de unitnamen hetzelfde blijven.
Geen enkele, omdat geen functie per editie wordt afgeschermd. De editievlag wordt tijdens het bouwen geïnjecteerd en heeft slechts twee gebruikers in de hele bibliotheek, beide cosmetisch: de titel van het About-venster en de tekst op het splashscherm van de IDE. Wat de niveaus echt veranderen, is de verpakking, omdat de Community- en Basic-installatieprogramma's gecompileerde binaries meeleveren en de .pas- en .inc-bestanden uitsluiten, terwijl het package met broncode ze wel bevat.
Ja. Er wordt een Lazarus-package meegeleverd, samen met de FreePascal-packagestubs en buildbestanden, en de compilerladder dekt FPC 2.2.2 tot en met 3.3.1. Er is één kanttekening die je moet weten voordat je begint: de Delphi-modus is voor Lazarus bewust uitgeschakeld in de compilerdefines, met een opmerking dat het daar mislukt, dus een unit die afhankelijk is van Delphi-modussemantiek moet worden aangepast.
Windows, Linux, macOS, FreeBSD, iOS en Android hebben allemaal hun eigen voorwaardelijke blokken in de compilerdefines. Unix-doelplatforms gebruiken OpenSSL en de meegeleverde zlib-unit. iOS is de enige met een echte beperking: OpenSSL moet daar statisch worden gelinkt in plaats van tijdens runtime te worden geladen.
De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Klaar om over te stappen van standaard Indy?

Het Community-package is gratis. Installeer het, bouw opnieuw en controleer het splashscherm.