IO::Select is what you want.
The following code can show you some basic ideas of IO::Select. Follow those steps:
- Run perl -w server.pl 3000 1
- Run perl -w server.pl 3001 10
- Run perl -w client.pl
Observe the client, see how it receives from server 1 (the faster guy), without being locked by the slower guy (server 2).
server
use strict;
use warnings;
use IO::Socket::INET;
my $server = IO::Socket::INET->new(Proto => "tcp", LocalAddr => "local
+host", LocalPort => $ARGV[0], Listen => 10);
my $connection = $server->accept();
print "Connected\n";
while (1) {
print $connection "$ARGV[0]\r\n";
print "sent $ARGV[0]\n";
sleep($ARGV[1]);
}
client
use strict;
use warnings;
use IO::Socket::INET;
use IO::Select;
my $connection1 = IO::Socket::INET->new(PeerAddr => "localhost", PeerP
+ort => 3000, Proto => "tcp");
my $connection2 = IO::Socket::INET->new(PeerAddr => "localhost", PeerP
+ort => 3001, Proto => "tcp");
my $selector = IO::Select->new();
$selector->add($connection1);
$selector->add($connection2);
while (1) {
my @readers = $selector->can_read(0);
for my $reader (@readers) {
my $line = <$reader>;
print $line;
}
}
|