http://www.perlmonks.org?node_id=914343


in reply to Re: IO::Select - reading multiple lines
in thread IO::Select - reading multiple lines

Monks,

I've many questions raising now., Let me tell what's in my mind.

So, is it a very worse idea to use <$fh> to read from a socket? Because, it is failing straight away without doing lot of magic(stuffs) in the code.

Server side
while(@ready = $sel->can_read) { if($fh == $lsn) { # Accept the socket $new = $lsn->accept; $sel->add($new); print "New client accepted\n"; print $new "abc\n"; print $new "abcd\n"; print $new "abcde\n"; print $new "abcdef\n"; } else { # Process socket $a = <$fh> ; if (not defined $a) { $sel->remove($fh); $fh->close; print "Client closed\n"; } else { print $a; } } }
Client side
while(@ready = $sel->can_read) { foreach $fh (@ready) { my $rr = <$fh>; exit if ( not defined $rr ); print $rr; } }

In the above sample, client is receiving only abc(first message) sent by server. When server quits, can_read is returning and client is receiving the remaining messages, not blocking. Getting messages one after another.

Then, I tried with sysread as suggested here. When using sysread, should I read byte by byte till '\n'? Because, I don't know the size of the message. Is it a good way to read byte by byte, do concatenation and then process the message?(I don't think so.)

Please, explain me some way to write a error free way(pleasant way too) to receive messages in socket.. or let me know what am I doing wrong.

Thanks.

Replies are listed 'Best First'.
Re^3: IO::Select - reading multiple lines
by zentara (Archbishop) on Jul 14, 2011 at 19:20 UTC
    is it a very worse idea to use <$fh> to read from a socket

    Yeah, you are best off using sysread, and there are a few ways to use sysread, depending on your situation, you can put it in various staement forms

    while( sysread $fh, $str, 8192, length $str ) { #or do { $rc = sysread(FH, $buff, 5000000, length($buff)) ; } while ($rc #or if ( sysread( $cli, $buffer, 1024 ) ) {} # etc etc

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh
      sysread returns 0, only when the other end exits. Getting into blocking mode, which is not desired. I expect the program to wait in select not in sysread.