in reply to IO::Handle read error description?

You can't rely on the commands making it through in one piece.

Furthermore, there are recommendations to avoid using buffered IO (<SOCK>, read, eof, getline, getlines) in the docs. sysread is not buffered.

my ($r_ready, $w_ready) = IO::Select::select($r_sel, $w_sel); foreach my $sock (@$r_ready) { # Create alias to the appropriate buffer. our $buf; local *buf = \$in_bufs{$sock}; my $rv = sysread($sock, $buf, 4096, length($buf)); # Read error. if (not defined $rv) { $r_sel->remove($sock); # ... Handle error socket ... next; } # Socket EOF if (not $rv) { $r_sel->remove($sock); # ... Handle closed socket ... next; } for (;;) { # Search for a complete command. my $pos = index($buf, "\x0A"); last if $pos < 0; my $cmd = substr($buf, 0, $pos+1, ''); # ... process $cmd ... } } foreach my $sock (@$w_ready) { # ... }

Update: Added code.
Update: Bug fix to handle the case where multiple commands in the buffer.

Replies are listed 'Best First'.
Re^2: IO::Handle read error description?
by Anonymous Monk on Apr 28, 2010 at 15:19 UTC
    hm. for this socket should be in non-blocking mode, right ?

      No. The whole point of using select is to let us know when reading from the socket won't block and when writing to the socket won't block.

      Unfortunately, it doesn't tell us how much we can write to it without blocking. We only know that we can write one byte without blocking. Maybe non-blocking sockets would help in the writing half. Ideally, there would be a system call that tells us how much we can write without writing. I don't know if there is one.

        I was thinking sysread(... 4096 ... will block until read all 4096 bytes...