Dos sockets con IO::Select
Publicado: 2009-05-28 12:23 @557
Hola a todos nuevamente.
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:
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:
El problema es que si mando al 9999 el [iyz]server[/iyz] se va en un [iyz]loop[/iyz] imprimiendo repetidamente:
Y por supuesto... si mando al 9998, el [iyz]loop[/iyz] se va infinitamente con:
¿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!
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.006 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.001 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!