Actually, what I was thinking of in my previous reply is sysread. read, 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
...