Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Re^2: IO::Select - reading multiple lines

by nagalenoj (Friar)
on Jul 14, 2011 at 13:23 UTC ( #914343=note: print w/replies, xml ) Need Help??

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


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.


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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://914343]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (8)
As of 2018-05-21 15:38 GMT
Find Nodes?
    Voting Booth?