Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

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

by Anonyrnous Monk (Hermit)
on Feb 15, 2011 at 21:20 UTC ( [id://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 ...

Replies are listed 'Best First'.
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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://888391]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (2)
As of 2026-04-17 03:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    hippoepoptai's answer Re: how do I set a cookie and redirect was blessed by hippo!
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.