Introducció

En aquest tema, explorarem com utilitzar Perl per a la programació de xarxes. Perl és una eina poderosa per a la manipulació de xarxes gràcies als seus mòduls integrats i la seva capacitat per gestionar tasques de xarxa de manera eficient. Aprendrem a crear clients i servidors, a treballar amb sockets i a utilitzar mòduls com Net::HTTP i LWP::UserAgent.

Conceptes Clau

  1. Sockets: Un socket és un punt final per a la comunicació entre dues màquines.
  2. Clients i Servidors: En la programació de xarxes, un client sol·licita serveis i un servidor proporciona aquests serveis.
  3. Protocols: Els protocols com HTTP, FTP, i TCP/IP defineixen les regles per a la comunicació de xarxa.

Sockets en Perl

Creació d'un Client TCP

Un client TCP es connecta a un servidor i envia o rep dades. A continuació, es mostra un exemple bàsic de client TCP en Perl:

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

# Creació del socket del client
my $socket = new IO::Socket::INET (
    PeerHost => '127.0.0.1',
    PeerPort => '5000',
    Proto => 'tcp',
) or die "No s'ha pogut connectar al servidor: $!\n";

print "Connectat al servidor\n";

# Enviar dades al servidor
my $data = "Hola, servidor!";
$socket->send($data);

# Rebre resposta del servidor
my $response = "";
$socket->recv($response, 1024);
print "Resposta del servidor: $response\n";

# Tancar el socket
$socket->close();

Creació d'un Servidor TCP

Un servidor TCP escolta les connexions entrants i respon als clients. Aquí teniu un exemple bàsic de servidor TCP en Perl:

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

# Creació del socket del servidor
my $socket = new IO::Socket::INET (
    LocalHost => '127.0.0.1',
    LocalPort => '5000',
    Proto => 'tcp',
    Listen => 5,
    Reuse => 1,
) or die "No s'ha pogut crear el socket: $!\n";

print "Servidor esperant connexions a la porta 5000\n";

while (1) {
    # Acceptar connexió del client
    my $client_socket = $socket->accept();
    
    # Rebre dades del client
    my $data = "";
    $client_socket->recv($data, 1024);
    print "Dades rebudes: $data\n";
    
    # Enviar resposta al client
    my $response = "Hola, client!";
    $client_socket->send($response);
    
    # Tancar el socket del client
    $client_socket->close();
}

# Tancar el socket del servidor
$socket->close();

Utilització de Mòduls de Xarxa

Net::HTTP

El mòdul Net::HTTP permet fer sol·licituds HTTP. Aquí teniu un exemple de com fer una sol·licitud GET:

use strict;
use warnings;
use Net::HTTP;

my $s = Net::HTTP->new(Host => "www.example.com") || die $@;
$s->write_request(GET => "/", 'User-Agent' => "Mozilla/5.0");

my ($code, $mess, %h) = $s->read_response_headers;
print "Codi de resposta: $code\n";

while (1) {
    my $buf;
    my $n = $s->read_entity_body($buf, 1024);
    die "Error de lectura: $!\n" unless defined $n;
    last unless $n;
    print $buf;
}

LWP::UserAgent

El mòdul LWP::UserAgent és una eina més avançada per fer sol·licituds HTTP. Aquí teniu un exemple de com fer una sol·licitud GET i processar la resposta:

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $response = $ua->get('http://www.example.com');

if ($response->is_success) {
    print $response->decoded_content;
} else {
    die $response->status_line;
}

Exercicis Pràctics

Exercici 1: Client i Servidor TCP

  1. Objectiu: Crear un client i un servidor TCP que intercanviïn missatges.
  2. Instruccions:
    • Modifiqueu els exemples de client i servidor TCP anteriors per enviar i rebre missatges personalitzats.
    • El client ha d'enviar un missatge al servidor, i el servidor ha de respondre amb un missatge diferent.

Exercici 2: Sol·licitud HTTP amb LWP::UserAgent

  1. Objectiu: Fer una sol·licitud GET a una pàgina web i processar la resposta.
  2. Instruccions:
    • Utilitzeu el mòdul LWP::UserAgent per fer una sol·licitud GET a una pàgina web de la vostra elecció.
    • Imprimiu el contingut de la resposta a la consola.

Solucions

Solució a l'Exercici 1

Client TCP:

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

my $socket = new IO::Socket::INET (
    PeerHost => '127.0.0.1',
    PeerPort => '5000',
    Proto => 'tcp',
) or die "No s'ha pogut connectar al servidor: $!\n";

print "Connectat al servidor\n";

my $data = "Hola, servidor!";
$socket->send($data);

my $response = "";
$socket->recv($response, 1024);
print "Resposta del servidor: $response\n";

$socket->close();

Servidor TCP:

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

my $socket = new IO::Socket::INET (
    LocalHost => '127.0.0.1',
    LocalPort => '5000',
    Proto => 'tcp',
    Listen => 5,
    Reuse => 1,
) or die "No s'ha pogut crear el socket: $!\n";

print "Servidor esperant connexions a la porta 5000\n";

while (1) {
    my $client_socket = $socket->accept();
    
    my $data = "";
    $client_socket->recv($data, 1024);
    print "Dades rebudes: $data\n";
    
    my $response = "Hola, client!";
    $client_socket->send($response);
    
    $client_socket->close();
}

$socket->close();

Solució a l'Exercici 2

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $response = $ua->get('http://www.example.com');

if ($response->is_success) {
    print $response->decoded_content;
} else {
    die $response->status_line;
}

Conclusió

En aquest tema, hem après els conceptes bàsics de la programació de xarxes amb Perl, incloent la creació de clients i servidors TCP, i l'ús de mòduls com Net::HTTP i LWP::UserAgent per fer sol·licituds HTTP. Amb aquests coneixements, esteu preparats per començar a desenvolupar aplicacions de xarxa més complexes amb Perl.

© Copyright 2024. Tots els drets reservats