Está usted en Indice > Construcción > Lenguajes > Perl > Lecciones y Paso a Paso > Crear un servidor de MP3 con Perl
Construcción
Maletín
Utilidades
Cursos
Promoción
Rentabilidad
Zona Novatos
Foros
Acceso a tu cuenta

Crear un servidor de MP3 con Perl (2)

Cuando un proceso hijo se muere manda una señal SIGCHLD al proceso padre. Entonces nuestro servidor necesita registrar una llave de señal para llamar a la función "waitpid" cada vez que se manda la señal SIGCHLD:

#crear la llave de la señal
$SIG{CHLD} = &REAPER;

#rutina para prevenir los zombies
sub REAPER{
#WNOHANG significa regresar inmediatamente si no hay hijo.
while ((waitpid(-1, WNOHANG)) >0 ){}

#resetea la señal para que el otro proceso hijo muera
$SIG{CHLD} = &REAPER;
}

Entonces ya para nuestro player de MP3 no hay mucho que añadir.

Básicamente el servidor empieza, entonces un cliente llega (por ejemplo xmms o mpgl23) abriendo un socket. Entonces el servidor hace un "fork" y regresa un socket al proceso hijo. Finalmente en proceso padre regresa para seguir escuchando y esperando a otro cliente. El proceso hijo simplemente irá en un loop continúo tocando canciones de nuestro lista de canciones aleatoriamente hasta que el cliente deje de escuchar.

NOTA: Puedes crear una lista de canciones MP3 usando el Winamp. O usando algo como: find / -name "*.mp3" > playlist.m3u

Código del servidor

Aquí esta el código final de nuestro servidor:

#!/usr/bin/perl -w

use strict;
use IO::Socket;

#tomar el puerto a controlar o por default 8000
my $port = $ARGV[0] || 8000;

#ignorar procesos hijos para evitar zombies
$SIG{CHLD} = 'IGNORE';

#crear el socket a escuchar
my $listen_socket = IO::Socket::INET->new(LocalPort => $port,
Listen => 10,
Proto => 'tcp',
Reuse => 1);

#asegurarnos que estamos controlando el puerto
die "Cant't create a listening socket: $@" unless $listen_socket;

warn "Server ready. Waiting for connections ... n";

#esperar conexiones
while (my $connection = $listen_socket->accept){
my $child;
# crear el fork para salir
die "Can't fork: $!" unless defined ($child = fork());

Continúa en la página siguiente



Usuarios que han visto este tema también han visto...

- Trabajar con archivos en Perl
- Conectar a una Base de Datos con Perl
- Algunos trucos para programar en PERL
- Utilizando FormMail
- Hola Mundo


Versión imprimible - Versión imprimible de este documento
Enviar e-mail - Enviar por e-mail este documento
Publicidad

Información legal | Política de Privacidad | Contacte con nosotros

Otro proyecto de Factoría de Internet. Copyright© 2003-2008 Factoría de Internet S.L.. Todos los derechos reservados.


Página generada el 28-08-2008 a las 16:26:59