use IO::Socket qw( );
my $sel = new IO::Select( $sock1, $sock2 );
while ( my @ready = $sel->can_read() ) {
foreach my $sock (@ready) {
if ($sock == $sock1) {
...do someththing...
if (...done...) {
$sel->remove( $sock1 );
}
}
elsif ($sock == $sock2) {
...do someththing...
if (...done...) {
$sel->remove( $sock2 );
}
}
}
}
####
sysread( $sock, $buf, 32*1024, length($buf) )
or do { $sel->remove( $sock ); next; };
while ( my ($msg) = $buf =~ s/^(...)// ) {
process($msg);
}
####
use IO::Socket qw( );
my $sel = new IO::Select();
my %clients;
for my $sock ($sock1, $sock2) {
$clients{$sock} = {
buf => '',
# ...
};
$sel->add( $sock );
}
while ( my @ready = $sel->can_read() ) {
foreach my $sock (@ready) {
my $client = $clients{$sock};
our $buf; local *buf = \( $client->{buf} );
sysread( $sock, $buf, 32*1024, length($buf) )
or do { $sel->remove( $sock );
delete $clients{$sock};
next;
};
while ( my ($msg) = $buf =~ s/^(...)// ) {
process($msg);
}
}
}