my $buf = ''; for (;;) { my $rv = sysread($sock, $buf, 64*1024, length($buf)); die $! if !defined($rv); last if !$rv; while ($buf =~ s/^([^\n]*\n)//) { process_msg("$1"); } } die("Partial message") if length($buf); #### my $buf = ''; my $want; for (;;) { my $rv = sysread($sock, $buf, 64*1024, length($buf)); die $! if !defined($rv); last if !$rv; for (;;) { if ($want) { last if length($buf) < $want; process_msg(substr($buf, 0, $want, '')); $want = 0; } else { last if length($buf) < 4; $want = unpack('N', substr($buf, 0, 4, '')); } } } die("Partial message") if $want || length($buf);