Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: reading from a socket, a little at a time

by Anonyrnous Monk (Hermit)
on Feb 15, 2011 at 21:20 UTC ( #888391=note: print w/ replies, xml ) Need Help??


in reply to reading from a socket, a little at a time

Actually, what I was thinking of in my previous reply is sysreadread, OTOH, does actually seem to block until the requested number of characters are read, or eof is reached (this is apparently due to the buffering that read involves, as opposed to sysread).  At least that's what a quick test shows.

Here's a simplified demo that (kind of) does what I understood you want to do:

Server:

#!/usr/bin/perl -w use strict; use IO::Socket::INET; my $server = IO::Socket::INET->new( LocalHost => 'localhost', LocalPort => 12345, Proto => 'tcp', Listen => SOMAXCONN, Reuse => 1 ) or die $!; print "server started\n"; $SIG{PIPE} = 'IGNORE'; while (1) { my $client = $server->accept(); print "accepted connection\n"; $client->autoflush(1); LOOP: for (1..1000) { my $count = int(rand 3)+1; # 1..3 32-bit BE uints, preceded by the respective count my $data = pack "N"x($count+1), $count, ($_)x$count; for (split //, $data) { last LOOP unless print $client $_; select undef, undef, undef, 0.01; # emulate slow delivery } } close $client; }

Client:

#!/usr/bin/perl -wl use strict; use IO::Socket::INET; my $sock = IO::Socket::INET->new("localhost:12345") or die $!; my $buf; while ($sock->read($buf, 4)) { # get count my $count = unpack "N", $buf; $sock->read($buf, $count*4); # read actual data my @data = unpack "N$count", $buf; print "$count: @data"; } close $sock;

Client output:

$ ./888339_c.pl 3: 1 1 1 3: 2 2 2 1: 3 1: 4 1: 5 3: 6 6 6 2: 7 7 3: 8 8 8 2: 9 9 3: 10 10 10 3: 11 11 11 2: 12 12 3: 13 13 13 3: 14 14 14 1: 15 ...


Comment on Re: reading from a socket, a little at a time
Select or Download Code
Re^2: reading from a socket, a little at a time
by Anonymous Monk on Feb 19, 2011 at 21:03 UTC
    Hi

    Thanks for that, it illustrates the point perfectly! Thanks again!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://888391]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2014-07-25 05:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (167 votes), past polls