Anet is a networking library for the Ada programming language.
Features
The Anet networking library has the following features:
-
BSD socket implementation
-
High abstraction level
-
Extendable socket type hierarchy
-
Socket receiver tasks (Stream and Datagram)
-
Ada type serialisation/deserialisation over sockets
-
Supported socket families
-
IPv4 (AF_INET)
-
IPv6 (AF_INET6)
-
Packet (AF_PACKET)
-
UNIX domain (AF_UNIX)
-
Netlink (AF_NETLINK)
-
-
Supported socket modes
-
Stream (TCP)
-
Datagram (UDP)
-
RAW
-
-
Support for IPv4/IPv6 multicast
-
Support for non-blocking operation
-
ARP packet serialization/deserialization
-
UDP/IPv4 packet creation and validation
-
Binding to the Linux Packet Filter (LPF) system
Download
Release version
The current release version of Anet is available at http://www.codelabs.ch/download/.
Verify a Release
To verify the integrity and authenticity of the distribution tarball type the following commands:
$ wget -q https://www.codelabs.ch/keys/0xDBF6D7E1095FD0D9.asc -O - | gpg --import $ gpg --verify libanet-{version}.tar.bz2.sig
The key fingerprint of the public key (0xDBF6D7E1095FD0D9) is:
Key fingerprint = 298F 4B32 C3C4 1D88 5949 86F3 DBF6 D7E1 095F D0D9
Development version
The current development version of Anet is available through its git repository:
$ git clone http://git.codelabs.ch/git/anet.git
A browsable version of the repository is also available here: http://git.codelabs.ch/?p=anet.git
Installation
To compile and install Anet on your system, you need to have the following software installed:
-
GNAT Ada compiler: http://www.gnu.org/software/gnat
If you want to run the unit tests before installation of Anet (which is recommended) you furthermore need to have the following installed:
-
Ahven (Test-Framework): http://ahven.stronglytyped.org/
Anet supports BSD and Linux operating systems. To build for BSD, append
OS=bsd
to the make
commands below. The building and installation process of
Anet is straightforward. Just type in the following commands.
$ make $ make PREFIX=/usr/local install
If neither PREFIX
nor OS
are specified, $(HOME)/libraries
is used as
installation directory and the library is built for Linux.
Testing
Anet contains a comprehensive unit test suite which can be run by entering the following command:
$ make tests
All tests should be marked with PASS behind the test name. To run the tests on BSD, type:
$ make tests OS=bsd
Licence
Copyright (C) 2011-2024 secunet Security Networks AG Copyright (C) 2011-2024 Reto Buerki <reet@codelabs.ch> Copyright (C) 2011-2024 Adrian-Ken Rueegsegger <ken@codelabs.ch> Free use of this software is granted under the terms of the GNAT Modified General Public License (GMGPL).
Example
Server (UNIX/TCP)
--
-- Copyright (C) 2012 secunet Security Networks AG
-- Copyright (C) 2012 Reto Buerki <reet@codelabs.ch>
-- Copyright (C) 2012 Adrian-Ken Rueegsegger <ken@codelabs.ch>
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the
-- Free Software Foundation; either version 2 of the License, or (at your
-- option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
--
-- This program is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-- for more details.
--
-- As a special exception, if other files instantiate generics from this
-- unit, or you link this unit with other files to produce an
-- executable this unit does not by itself cause the resulting
-- executable to be covered by the GNU General Public License. This
-- exception does not however invalidate any other reasons why the
-- executable file might be covered by the GNU Public License.
--
with Ada.Streams;
with Ada.Text_IO;
with Anet.Streams;
with Anet.Sockets.Unix;
with Anet.Receivers.Stream;
procedure Server is
package Unix_TCP_Receiver is new Anet.Receivers.Stream
(Socket_Type => Anet.Sockets.Unix.TCP_Socket_Type,
Address_Type => Anet.Sockets.Unix.Full_Path_Type,
Accept_Connection => Anet.Sockets.Unix.Accept_Connection);
procedure Handle_Request
(Src : Anet.Sockets.Unix.Full_Path_Type;
Recv_Data : Ada.Streams.Stream_Element_Array;
Send_Data : out Ada.Streams.Stream_Element_Array;
Send_Last : out Ada.Streams.Stream_Element_Offset);
-- Handle requests from clients.
procedure Handle_Request
(Src : Anet.Sockets.Unix.Full_Path_Type;
Recv_Data : Ada.Streams.Stream_Element_Array;
Send_Data : out Ada.Streams.Stream_Element_Array;
Send_Last : out Ada.Streams.Stream_Element_Offset)
is
Stream : aliased Anet.Streams.Memory_Stream_Type (Max_Elements => 4);
Number : Integer;
begin
Ada.Text_IO.Put_Line ("Received data on socket "
& Anet.Sockets.Unix.To_String (Path => Src));
Stream.Set_Buffer (Buffer => Recv_Data);
Integer'Read (Stream'Access, Number);
Number := Number + 1;
Integer'Write (Stream'Access, Number);
Send_Last := Stream.Get_Buffer'Length;
Send_Data (Send_Data'First .. Send_Last) := Stream.Get_Buffer;
end Handle_Request;
Socket : aliased Anet.Sockets.Unix.TCP_Socket_Type;
Receiver : Unix_TCP_Receiver.Receiver_Type (S => Socket'Access);
begin
Socket.Init;
Socket.Bind (Path => "/tmp/anet.example");
Receiver.Listen (Callback => Handle_Request'Access);
end Server;
Client (UNIX/TCP)
--
-- Copyright (C) 2012 secunet Security Networks AG
-- Copyright (C) 2012 Reto Buerki <reet@codelabs.ch>
-- Copyright (C) 2012 Adrian-Ken Rueegsegger <ken@codelabs.ch>
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the
-- Free Software Foundation; either version 2 of the License, or (at your
-- option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
--
-- This program is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-- for more details.
--
-- As a special exception, if other files instantiate generics from this
-- unit, or you link this unit with other files to produce an
-- executable this unit does not by itself cause the resulting
-- executable to be covered by the GNU General Public License. This
-- exception does not however invalidate any other reasons why the
-- executable file might be covered by the GNU Public License.
--
with Ada.Text_IO;
with Ada.Streams;
with Anet.Streams;
with Anet.Sockets.Unix;
procedure Client is
Number : Integer := 0;
Socket : Anet.Sockets.Unix.TCP_Socket_Type;
Stream : aliased Anet.Streams.Memory_Stream_Type (Max_Elements => 4);
begin
Socket.Init;
Socket.Connect (Path => "/tmp/anet.example");
loop
Ada.Text_IO.Put_Line ("PING" & Number'Img);
Integer'Write (Stream'Access, Number);
Socket.Send (Item => Stream.Get_Buffer);
declare
Buffer : Ada.Streams.Stream_Element_Array (1 .. 4);
Last : Ada.Streams.Stream_Element_Offset;
begin
Socket.Receive (Item => Buffer,
Last => Last);
Stream.Set_Buffer (Buffer => Buffer (Buffer'First .. Last));
Integer'Read (Stream'Access, Number);
Ada.Text_IO.Put_Line ("PONG" & Number'Img);
end;
delay 1.0;
end loop;
end Client;