Я никогда не использую recv
, поэтому я не знаю его причуд.Я использую sysread
.
sub read_until_eof {
my ($fh) = @_;
my $buf = '';
for (;;) {
my $rv = sysread($fh, $buf, 64*1024, length($buf))
die $! if !defined($rv);
return $buf if !$rv;
}
}
Если этого не произойдет, я предлагаю вам использовать tcpdump
, чтобы выяснить, есть ли проблема в отправителе, получателе или где-то между ними.
sysread
и "причуды" read
:
sysread
всегда возвращается, как только байты доступны, независимо от того, сколько байтов было запрошено.Это означает, что он немедленно возвращается, если байты уже доступны при вызове.Он будет блокироваться до тех пор, пока не поступит пакет.Это означает, что нужно выполнить цикл, если требуется определенное количество символов.
Напротив, read
ждет, пока не будет доступно запрошенное количество байтов.Он возвращается только тогда, при EOF или при ошибке.
read
и sysread
фактически работают на уровне символов, что означает, что вы фактически указываете желаемое количество символов, а не количество байтов.Эти символы могут быть байтами, кодовыми точками Unicode или любым другим, в зависимости от того, какой слой ввода-вывода вы добавили в дескриптор.