use strict; use warnings; use IO::Select qw( ); use IO::Socket qw( ); my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => 8080); my $sel = IO::Select->new( $lsn ); my $no_error = my ($r_ready, $w_ready, $e_ready) = IO::Select->select($sel, undef, undef, 2.2); if ($no_error) { print("No error\n"); print("Num readers ready: ", 0+@$r_ready, "\n"); print("Num writers ready: ", 0+@$w_ready, "\n"); print("Num errors ready: ", 0+@$e_ready, "\n"); } else { print("Error ", 0+$!, ": $!\n"); } #### Win>perl a.pl Error 0: linux$ perl a.pl Error 29: Illegal seek #### use strict; use warnings; use IO::Socket qw( ); my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => 8080); my $r_in = my $w_in = my $e_in = ''; vec($r_in, fileno($lsn), 1) = 1; vec($r_in, 100, 1) = 1 if $ARGV[0]; my $nfound = select( my $r_ready = $r_in, my $w_ready = $w_in, my $e_ready = $e_in, 2.2, ); $nfound >= 0 or die("select: (" . (0+$^E) . ") $^E\n"); if ($nfound) { print("nfound = $nfound\n"); } else { print("Timeout\n"); } #### Win>perl a.pl 0 Timeout Win>perl a.pl 1 select: (10038) Unknown error Using $^E instead of $! gives select: (10038) An operation was attempted on something that is not a socket linux$ perl a.pl 0 Timeout linux$ perl a.pl 1 select: (9) Bad file descriptor #### - if(select($rb,$wb,$eb,$t) > 0) + if(select($rb,$wb,$eb,$t) >= 0) #### use strict; use warnings; use IO::Select qw( ); use IO::Socket qw( ); my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => 8080); my $sel = IO::Select->new( $lsn ); my ($r_ready, $w_ready, $e_ready) = IO::Select->select($sel, undef, undef, 2.2) or die("Can't select: (" . (0+$!) . ") $!\n"); if (@$r_ready + @$w_ready + @$e_ready == 0) { print("Timeout\n"); } else { print("Num readers ready: ", 0+@$r_ready, "\n"); print("Num writers ready: ", 0+@$w_ready, "\n"); print("Num errors ready: ", 0+@$e_ready, "\n"); }