Les cuento que quiero hacer una pequeña prueba para un módulo de mayor tamaño. Mi objetivo es hacer un único programita en Perl que abra dos [iyz]sockets[/iyz] distintos en un mismo [iyz]host[/iyz] y quede escuchando en ambos... y bueno, poder discriminar por cual de los dos entró un mensaje.
El código que estoy probando lo tomé prestado de otra respuesta en este mismo foro y es:
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use IO::Socket;
use IO::Select;
use strict;
my $srv_sock = IO::Socket::INET->new (
Hostname => "192.168.1.2",
LocalPort => "9999",
Proto => 'udp'
) or die "socket: $@";
my $rqt_sock = IO::Socket::INET->new (
Hostname => "192.168.1.2",
LocalPort => "9998",
Proto => 'udp'
) or die "socket: $@";
my $selector = new IO::Select ( $srv_sock, $rqt_sock );
while (my @ready = $selector->can_read ) {
foreach ( @ready ) {
( $_ == $srv_sock ) ? print "server\n" : print "request\n";
}
}
use IO::Socket;
use IO::Select;
use strict;
my $srv_sock = IO::Socket::INET->new (
Hostname => "192.168.1.2",
LocalPort => "9999",
Proto => 'udp'
) or die "socket: $@";
my $rqt_sock = IO::Socket::INET->new (
Hostname => "192.168.1.2",
LocalPort => "9998",
Proto => 'udp'
) or die "socket: $@";
my $selector = new IO::Select ( $srv_sock, $rqt_sock );
while (my @ready = $selector->can_read ) {
foreach ( @ready ) {
( $_ == $srv_sock ) ? print "server\n" : print "request\n";
}
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Cuando ejecuto este código se queda esperando. Luego, desde otra ventana mando mensaje al puerto 9999 o 9998, con un código en Perl como este:
Using perl Syntax Highlighting
$sock = IO::Socket::INET->new(Proto => 'udp',
PeerPort => $portno,
PeerAddr => "192.168.1.2")
or die "Creating socket: $!\n";
$sock->send($msg) or die "send: $!";
PeerPort => $portno,
PeerAddr => "192.168.1.2")
or die "Creating socket: $!\n";
$sock->send($msg) or die "send: $!";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
El problema es que si mando al 9999 el [iyz]server[/iyz] se va en un [iyz]loop[/iyz] imprimiendo repetidamente:
- Código: Seleccionar todo
server
server
server
...
Y por supuesto... si mando al 9998, el [iyz]loop[/iyz] se va infinitamente con:
- Código: Seleccionar todo
request
request
request
...
¿Por qué pasa esto?
La verdad es que estos son mis primeros intentos con IO::Select... así que agradeceré mucho la ayuda que me puedan dar.
Salu2!