P1N6Ü1N0 - PERL - Sockets |
|
![]() Inicio C Perl Caml Shell GTK SQL |
La programación con sockets es sin duda la parte más interesante de PERL, porque un programa que en C ocupa 100 líneas de código, en perl se puede hacer en 5 o 6, gracias al módulo IO::Socket. Para usarlo basta con poner: use IO::Socket; ...y automáticamente tenemos una cantidad inmensa de comodidades. No voy a explicar el API de este módulo porque para eso ya está perldoc. Sólo teneis que poner: perldoc IO::Socket Y tendréis la ayuda necesaria (también está en página man). Lo que voy a hacer es mostrar un par de ejemplos, para que veas que es realmente MUY sencillo de usar. Ejemplo 1: Un cliente web (un navegador, vamos...)
#!/usr/bin/perl -w
use IO::Socket;
unless (@ARGV > 1) { die "usage: $0 host document ..." }
$host = shift(@ARGV);
foreach $document ( @ARGV ) {
$remote = IO::Socket::INET->new( Proto => "tcp",
PeerAddr => $host,
PeerPort => "http(80)",
);
unless ($remote) { die "cannot connect to $host" }
$remote->autoflush(1);
print $remote "GET $document HTTP/1.0\n\n";
while ( <$remote> ) { print }
close $remote;
}
Sólo hay que destacar una cosa importante, fíjate que se usa el socket cómo si fuera un descriptor de fichero (<>), esto es muy cómodo... podeis probarlo, suponiendo que se llama navegador.pl, poniendo esto: navegador.pl programacion.mundivia.es /ryu/index.html Cómo veis, un programa para bajarse páginas web en sólo 12 líneas, mientras que este mismo ejemplo en C no bajaría de las 50. Ejemplo 2: Un programa servidor
#!/usr/bin/perl -w
use IO::Socket;
use Net::hostent; # OO version of gethostbyaddr
$PORT = 9000; # pick something not in use
$server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT,
Listen => SOMAXCONN,
Reuse => 1);
die "can't setup server" unless $server;
print "[Server $0 accepting clients]\n";
while ($client = $server->accept()) {
$client->autoflush(1);
print $client "Welcome to $0; help for command list.\n";
$hostinfo = gethostbyaddr($client->peeraddr);
printf "[Connect from %s]\n", $hostinfo->name
|| $client->peerhost;
print $client "Command? ";
while ( <$client>) {
next unless /\S/; # blank line
if (/quit|exit/i)
{ last; }
elsif (/date|time/i)
{ printf $client "%s\n", scalar localtime; }
elsif (/who/i )
{ print $client `who 2>&1`; }
elsif (/cookie/i )
{ print $client `/usr/games/fortune 2>&1`;}
elsif (/motd/i )
{ print $client `cat /etc/motd 2>&1`; }
else {
print $client "Commands: quit date who cookie motd\n";
}
} continue {
print $client "Command? ";
}
close $client;
}
Este ejemplo es un poco más largo, pero fijaos en la cantidad de cosas que hace, te pone un servidor en el que puedes mandar comandos, los analiza y te manda el motd, ejecuta el fortune, te pone la hora o te hace un who, y todo en estas pocas líneas... Para probarlo, basta con ejecutarlo simplemente, y para conectarse a él, se puede poner algo así: telnet 127.0.0.1 9000 Y nos aparecerá el servidor automáticamente, para poner comandos. Te imaginas lo fácil que sería hacer un juego en modo texto de red así? Estos ejemplos están extraidos de la página de manual perlipc, y hay más, así que si quereis más info: man perlipc ... y luego buscad "IO::Socket" (con la barrita /) |
| Los gráficos de esta página han sido creados con GIMP. |