Sign in Join
Wiki copytemporary

Indy with Lazarus

한국어 · Deutsch · English · Español · Français · 日本語

Indy is an open source client/server communications library that supports TCP/UDP/RAW sockets, as well as over 100 higher level protocols including SMTP, POP3, IMAP, NNTP, HTTP, FTP, and many more

Indy for Lazarus

A new attempt at converting Indy is being undertaken by the Indy core team. FPC developer Marco van de Voort is working with Indy core to get Indy fully working with FPC/Lazarus. Specially Indy's JP Mugaas did a lot of good work in getting Indy10 to work with FPC. The native unixrtl backend is mostly his work too.

Currently Indy10 is nearly fully working, and end-user usability has been improved a lot. Only special topics like OpenSSL and compression might need additional knowledge. 64-bit support hasn't entirely been validated either.

Hint: I'm not very interested in support the Kylix side of Indy. (anything that uses unit libc). I ported it only as step up to native Unix RTL using Indy apps.

Requirements

FPC 2.0.4 is very close to being able to use Indy in all its facets, except for the server bug on FreeBSD/macOS (which requires 2.1.1)

Since Indy10 now works for all major targets, we focus on this version. While conversion to Indy9 might be simpler for people, keep in mind that it only works on Win32 (and theoretically could be ported to Linux/x86).

Therefore we recommend people to work with 10 as much as possible.

(For indy9, you might need to remove the overriding of TMemoryStream.SetSize method (Marcov: ???) to get telnet components working, but Indy9 hasn't been tested in a while).

The port is fairly stable, and JP Mugaas has done a great deal to improve the quality of the release, a set of makefiles inclusive.

Downloads / Links

Current snapshots (for die hards only) are at

What works, what not

Indy9:

Indy10:

All: secure versions not tested yet.

Short term plans

Problems

Bugs

Ubuntu 10.04 + Lazarus 0.9.28 + Indy 10(Server Component) -> launch & do nothing (just crash)

Solution (bruce0829@yahoo.com.tw collect and organize data):

(1).Lazarus Main menu -> Project -> Compiler Options -> Other Page , add the "-dUseCThreads" parameter. (2).force the IdTCPServer to work in Id_IPV4 mode.

pascal
procedure TForm1.FormActivate(Sender: TObject);
var
  Binding: TIdSocketHandle;
begin 
  //uses idGlobal
  //explicitly adding a Binding object prevents TIdTCPServer
  //from creating its own default IPv4 and IPv6 Binding objects
  //on the same listening IP/Port pair...
  Binding := IdTCPServer1.Bindings.Add;
  Binding.IPVersion := Id_IPv4; //optional: forces the Binding to work in Id_IPV4 mode.
  Binding.IP := '127.0.0.1';
  Binding.Port := 6501; //customization 
  IdTCPServer1.Active := True;  
end;

(3)use TIdSync to Control your GUI in IdTCPServer's OnExecute() event.

Installation

How to install

Comment from RLebeau: Indy is available in Online Package Manager.

Comment from Matthijs: So it is not perfect yet, but you want to try it. Here is how you install it in Lazarus.

Then rebuild Lazarus and you will see a 15 tab's with Indy components.

How to install on Debian/Ubuntu

Commands in Terminal:

cd indy-10.2.0.1/fpc
chmod +x debian/rules
touch README
sudo apt-get install fakeroot
dpkg-buildpackage -rfakeroot -uc
cd ..
sudo dpkg -i *.deb

Then install the package indylaz.lpk in Lazarus.

How to install [2]

If you couldn't install Indy for Lazarus with tips above, you can try this...

From Yahoo! Brazil, Lazarus Group (User Everaldo)

Version installed on Lazarus 0.9.24 using component indy-10.2.0.1.

On LINUX the path is: /usr/lib/lazarus/components/indy-10.2.0.1/

How to install on Windows and Debian Linux, Indy 10.5 and above

In order to write & compile Indy10 applications, you need to put the path to the Indy directory in the "Other Unit files" textbox of every project that you write. You'll find "Other Unit files" under Project Options -> Compiler Options -> Paths.

How to install (confirmed) on Windows - Indy 10.2

For a lot of users, I'm sure that the information given above won't work, or will be somewhat confusing given the differences between versions and inconsistent explanations.

The website points you to download the latest version from the snapshots page. This wiki tells you to copy a lot of files over into directories. For me, neither worked, and ended up making a mess of my Lazarus installations.

  1. Firstly, the page I would retrieve this from is here. Other sites I tried had problems with some files inside the archive.
  2. When you open up the archive above, you will see there are folders: "fpc" and "lazarus".
    1. You can copy the contents of "fpc" into: LAZARUS_DIR\fpc\2.6.0\source\packages\indylaz if you want to have things neat and tidy.
    2. The "lazarus" folder, you copy into LAZARUS_DIR\components\indylaz
    3. With both of these, make sure that there isn't a sub-directory inside the folders given. i.e. LAZARUS_DIR\components\indylaz\lazarus\
  3. Go into Lazarus and go to "Package" -> "Open package file" and point it to the "indylaz.lpk" inside the LAZARUS_DIR\components\indylaz directory.
  4. Once the package loads inside your project, click on the "options" button, which resembles an image of a parcel with a cog next to it.
  5. Click the "Compiler Options" on the left-hand side and Click on the ".." button next to "Other unit files (-Fu) (delimiter is semicolon)".

Select the "fpc" then "lazarus" folders you created above and click OK. Lazarus will sort out the relative path for you. Don't change it.

  1. Click OK and compile and then direct angry bile towards the individual who has steered you wrong with the previous, unhelpful, instructions.

Issue on Windows 64 bits

On Windows 64 bits, the compilation of the archive mentioned above will not work. This can be fixed by editing IdAntiFreeze.pas, replacing:

pascal
 type
   TIdAntiFreeze = class(TIdAntiFreezeBase)
   public
     procedure Process; override;
   end;

by

pascal
 type
   TIdAntiFreeze = class(TIdAntiFreezeBase)
   public
     {$IFDEF WIN32}
     procedure Process; override;
     {$ENDIF}
   end;

Various tips

Memory leaking issue

If you have memory leaks in your Indy application, that is because you use IdStack or IdThread units, or components that depend on them. It is intended by design, and in Delphi the leak reports are suppressed by registering the leaks with the memory manager. This feature is not available with Free Pascal, but you can remove the deliberate memory leaks. In file IdCompilerDefines.inc you should replace this line:

pascal
 {.$DEFINE FREE_ON_FINAL}
 {$UNDEF FREE_ON_FINAL}

with this:

pascal
 {$DEFINE FREE_ON_FINAL}
 {.$UNDEF FREE_ON_FINAL}

and recompile Lazarus and Indy. Beware that IdCompilerDefines.inc exists in 5 different directories and you need to make changes in all of them.

Important developer note

The leaks are not a matter of not being able to free the objects (obviously, they can be, as seen when FREE_ON_FINAL is defined), but more a matter of unit dependency. The objects in question are shared with other units, and it has been noticed that sometimes units may not always be finalized in the order you are expecting, and that has been observed in the wild. So rather than freeing these objects by default, they are leaked instead, in case they are still accessed later. The leak is minor (only a few bytes), and only during unit finalization, which 9x% of the time will only be during application shutdown (unless you are using Indy in a DLL that gets unloaded dynamically during runtime).

How to use non-blocking TCP sockets

Advice from FPC developer Marco van de Voort: Indy can be used nonblocking if you regularly check for data on source:

pascal
  fclient.IOHandler.CheckForDataOnSource(5);

and then never read more than InputBuffer.Size:

pascal
  insiz:= IOHandler.InputBuffer.Size;
  IOHandler.ReadStream(strmbuf, insiz, false);

While Indy 10 does a lot with streams (due to its .NET heritage) you can workaround it by using a TCustomMemoryStream derivative that just points to your own buffers, with nearly no overhead.

I myself use this for a set of client-servers that do work in threads, but use events to try to reach (relatively) low latency comms.

External links


From the Free Pascal wiki, page "Indy with Lazarus", as it stood on 2022-08-09 after a change by Alextp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.