Serveur TCP en Perl

Posted on 29/12/2010 · Posted in Perl

Le script suivant permet de réaliser un simple serveur TCP en Perl.
Vous pourrez accéder ensuite à ce serveur grâce à une connexion telnet.

1
shell# telnet 127.0.0.1 3000

Le serveur ne fait qu’afficher des informations à l’utilisateur, et retourne ce que l’utilisateur tape.
Pour terminer la connexion, l’utilisateur utilisera le mot clé : quit.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl -w

use strict;
use IO::Socket::INET;

my $server = IO::Socket::INET->new ( LocalPort => 3000, Type => SOCK_STREAM, Reuse => 1, Listen => 5) or die "Probleme serveur";
my $client;
my $chaine;
my $pid;

$SIG{CHLD} = 'IGNORE';

while ( $client = $server->accept ())
{
        $pid = fork;
        unless ($pid)
        {
                while ( 1 )
                {
                        print $client "Vous voulez dire ? ";
                        $chaine = ;
                        exit unless defined $chaine;

                        chomp ($chaine);

                        if ( $chaine =~ "quit" )
                        {
                                $client->shutdown ( 2 );
                                exit;
                        }
                        else
                        {
                                print $client "Vous avez dit : $chainen";
                        }
                }
        }
}

Explication

1
$SIG{CHLD} = 'IGNORE';

Le script réalise un fork pour chaque nouvel utilisateur. Lorsque l’utilisateur termine la connexion le processus fils va se terminer grâce à la commande “exit”.
Sans $SIG{CHLD} = ‘IGNORE’ le processus fils serait transformé en processus Zombie jusqu’à ce que le processus parent soit terminé. Si vous réalisez un Daemon cela risque de saturer votre table de processus.

1
$server->accept ()

Met en stand-by le processus jusqu’à la connexion d’un nouvel utilisateur.
Cette fonction retourne un objet de type IO::Socket.

1
$chaine = ;

Le processus en charge du client attend que celui-ci saisisse une valeur au clavier.

1
$client->shutdown ( 2 );

On termine la connexion avec l’utilisateur proprement.
Le numéro 2 indique au client que l’on a fini d’utiliser le socket.
Pour plus d’information sur cette méthode, voici la Perldoc.