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 | |
by ikegami (Patriarch) on Apr 28, 2010 at 17:56 UTC | |
by vsespb (Chaplain) on Apr 28, 2010 at 18:56 UTC | |
by ikegami (Patriarch) on Apr 28, 2010 at 19:44 UTC |