lNet

From Lazarus wiki
Jump to navigationJump to search

About

lNet or LightWeight Networking Library is a collection of classes and components to enable event-driven TCP or UDP networking. lNet is released under a modified LGPL license. (permits static linking)

The package consists of base lNet units library, lTelnet for telnet protocol, lFTP for ftp protocol and lNetComponents libraries for providing visual and non-visual components for networking. As of 0.4.0 lHTTP and lSMTP components have been added.

The non-visual console components were tested on Win32, Win64, Linux_x86_32, Linux_x86_64, Linux_PPC, Linux_PPC_64, FreeBSD_x86_32.

The visual (lazarus packages) components were tested in Win32, Linux_x86_32 and FreeBSD_x86_32.

Homepage of the lNet base libraries is: http://members.chello.sk/ales (currently being reworked, this site is main resource for now)

As of version 0.3 the package is only single-threaded. I've dropped multithreaded version and now use exclusively LCL features to work.

As of version 0.4 the package has "eventers" which enable per-OS optimalizations and additional flexibility including watching for events on files additionaly to the sockets.

Authors

Ales Katona (User: Almindor)
Micha Nelissen

License

Modified LGPL (read LICENSE and LICENSE.ADDON included in package).

Contact

You can contact me directly by email or go to #lnet channel on freenode.

News

14th of April 2007:


Released 0.5.0 not according to schedule. New stuff:

* fixed some ugly UDP bugs
* fixed windows blocking problems with visual lNet (dialogs and menus blocked our events)
* API cleanups (WARNING: See here<>)
* preliminary winCE support with Lazarus/fpc cross compilation (alpha)

This is mostly a bugfix and stabilization release. Many planned features got dropped until we got something we felt right with. Sorry for the delay as well but school was keeping me quite occupied lately.

25th of September 2006:


Released 0.4.0 according to schedule. New features:

* completly rewritten internal structure with eventers allowing flexibility and per-OS/arch optimalization
* completly rewritten internal structure for visual lnet to allow "LCL" quasi eventer
* added HTTP server and client components, and HTTP client visual component
* added highly experimental fastcgi support to HTTP server
* added SMTP client support console and visual
* utilized latest available technoglogies by using KQueue in FreeBSD and Epoll in linux (2.6+ only)

Luckily all these changes could be made without braking old API. There was only a very tiny API change because of consistency reasons which is documented.

Dig in! :)

18th of September 2006:


Since last release of 0.3.1 we have been working hard on the 0.4.x branch which adds alot of new features and is a complete internal redesign of lNet.

We are currently trying the clean the 0.4.0 lNet of bugs so that the release is trouble-less for all platforms.

Changes include new internal structure (NO API changes, except one property in TLSocket for consistency, will be documented) with "eventer" classes which take care of events. This enables us to use native best-perfomance solutions on various platforms (epoll in linux, kqueue in BSDs, io ports in windows and so on). It also enables users to "watch" for events on normal files and objects(in case of windows) so they save alot of processing power (just one or few syscalls in place for tens).

The http server has been updated and experimental fastcgi support is currently being added. There's also a http client with a "Get" example program.

SMTP was added to 0.4.0 including a visual version for lNet.

We hope to release 0.4.0 in one week (25th of September 2006).

Download

Change Log

  • Version 0.5.0 stabilization and API cleanups
  • Version 0.4.0 complete overhaul and new components
  • Version 0.3.1-1 30.01.2006 (fixed a fixes bug in Linux version, should compile now)
  • Version 0.3.1 27.01.2006
  • Version 0.3.0 (2.4.0) 16.01.2006
  • Version 0.2.0 29.11.2005
  • Version 0.1.0 12.11.2005

Status

  • Base lNet TCP/UDP - stable
  • Telnet Client - stable*
  • FTP Client - stable*
  • SMTP Client - stable**
  • HTTP Client - experimental
  • HTTP Server - experimental

* FTP and Telnet still need some additional features like authentification methods.
** SMTP still needs proper MIME support for encoding attachments, but API should only grow from now on.

Roadmap

  • Stress testing [always]
  • Addition of Telnet and FTP clients (experimental level) [0.3] (done)
  • Cementing of TCP/UDP API [0.3] (done)
  • Addition of ICMP Ping/Traceroute protocol [0.4] (postponed to 0.5+)
  • Addition of SMTP, HTTP components [0.4] (done)
  • Stabilization of Telnet and FTP clients [0.4/0.5] (partialy completed)
  • Addition of Telnet and FTP servers (experimental level) [0.5]
  • Addition of SSL, FTPS [0.6+]

Dependencies / System Requirements

  • Lazarus 0.9.18+ and FPC 2.0.4+
  • Status: Beta
  • Issues: Completly tested on Windows (WinXP), Linux (Ubuntu 6.06LTS) and FreeBSD 6.1. HTTP server has issues under high load with fastcgi usage. FastCGI works only in Linux for now.

Installation

  • In the lazarus/components directory, unzip the files from lnet-<version>.zip file. The lnet-<version> folder will be created.
  • Open lazarus
  • Open the package lnet-<version>/lazaruspackage/lnetpackage.lpk with Component/Open package file (.lpk)
  • Click on Compile
  • Open the package lnet-<version>/lazaruspackage/ide/lnetidepackage.lpk with Component/Open package file (.lpk)
  • Click on Install and answer 'Yes' when you are asked about Lazarus rebuilding. A new tab named 'lNet' will be created in the components palette.


NOTE: older lNet is extraced to "lnetpackage" dir. Since 0.4.0 the "visual" and "non visual" packages are in one distribution file.

Ubuntu special notice

On Ubuntu lazarus components folder is "/usr/lib/lazarus/components". You must copy the lNetpackage in this folder and unzip in this folder to generate lnetpackage folder.

On this distribution your may have issues if you don't use the root account because you won't have writing rights on this folder... Activate the root account management and log in with the root account before doing any operation.

Some "missing files" are, in fact, in the "/net" subfolder and are not found by the fpc compiler. Simply copy missing files from the subfolder (lnet.pas, tomwinsock.pas, lfunc.inc...) "/usr/lib/lazarus/components/lnetpackage/lnet" in the "/usr/lib/lazarus/components/lnetpackage" folder. Then complete the setup by following the installation procedure.

by Steph12358

Documentation

Documentation of lNet is underway. Until we have full docs, you can use Jesus' diagrams of classes and units as basic reference.

Overview diagrams can be found here: http://members.chello.sk/ales/docs/diagrams/overview.html
Pictures: All classes lNet units lNet units 2

Usage

TCP/UDP

Drop a TLTCPComponent or TLUDPComponent on a form. Assign OnAccept, OnError, OnReceive, OnConnect and OnDisconnect event handlers. Note that this is optional but in most cases required for functionality.

Client connection is initialized with the Connect call. Arguments are IP address/hostname and port respectivly. Non-blocking connect is used, this means that you DON'T know that you're connected until OnConnect event is fired.

Server connection is initialized with the Listen* call. Argument is port.

Note: address is a string representation of IP eg: '127.0.0.1' or a hostname like 'localhost'.

Sending data to the other side is accomplished with the Send/SendMessage method.

Events of TLNetComponent class.

  • OnError - this event is fired whenever a connection error occurs. If no handler is assigned an excepion with "msg" is raised. Arguments are: msg - contains string and numerical representation of error message formatted in native encoding or UTF8 (depending on ForceUTF8 property). aSocket is the socket at which the error occured, nil means that the error is not a socket specific one.
  • OnConnect - This event is fired when the client succesfuly connects. aSocket is the socket which connected. It should serve as the "start" point for clients.
  • OnAccept - this event is fired whenever a connection is accepted on a server. If no handler is assigned nothing is done. aSocket contains the socket which accepted the connection.
  • OnDisconnect - this event is fired whenever a connection is lost. If no handler is assigned nothing is done. aSocket contains the socket which got disconnected.
  • OnReceive - This event is fired whenever new data is ready to be received. If no handler is assigned nothing is done, but a system buffer fill may happen which will in turn fire an OnError event. aSocket is the socket at which the data got received. Data is read by Get/GetMessage method.
  • OnCanSend - This event is fired whenever new data can be sent again on a socket, after a call to send function failed, returning 0. It can be used to automate sending of big chunks. aSocket is socket on which send can be called.

API changes

0.1 to 0.2 There have been some API changes from 0.1 to 0.2. These were required and should improve the usability of packages. I know API changes are always a PITA but I'll try to keep them minimal from now on. Version 0.3 will be the first beta from which API will remain unchanged (only adding new stuff will be possible).

  • OnRecieve() changed to OnReceive()
  • Accept() changed to Listen()
  • All events' arguments changed. SocketNumber (int) got changed into aSocket(TLSocket) because of logical and speed reasons

0.2 to 0.3 Added OnCanSend and OnConnect. Connect is now non-blocking. Removed buffersize and maxmsgs. Buffersize is no longer required because no internal buffer is used.

0.3 to 0.4 Lots of additions. Only "breakage" is that TLSocket.Port got changed into TLSocket.LocalPort and TLSocket.PeerPort for consistency reasons.


WARNING: In version 0.4.0, I forgot to move lHTTPSettings unit from lib to the http example. It was NOT supposed to be a part of the library, just the example. DON'T use this, it's not a "library", it's a part of the example (http server will get it's own project later)