Документация для recv
в моей системе (Linux) гласит:
Если в сокете нет доступных сообщений, принимающие вызовы ожидают прибытия сообщения
и
Если сообщение слишком длинное, чтобы поместиться в предоставленный буфер, лишние байты могут быть отброшены в зависимости от типа сокета, из которого получено сообщение.
Исходя из документации, я ожидал бы, что мой recv
чтобы дождаться сообщения, а затем эффективно отбросить его (UDP) или оставить его в потоке (TCP).
Это можно использовать для проверки наличия неблокирующего сокета TCP, ожидающего данные.
Обновление : тестирование показывает, что такое толкование документации является точным.
Сервер:
$ perl -MIO::Socket::INET -E'
my $s = IO::Socket::INET->new(Listen => 1) or die $!;
say $s->sockport;
my $c = $s->accept or die $!;
say "[".localtime."] connected";
$c->recv(my $buf, 0) // die $!;
say "[".localtime."] received";
say <$c>;
'
39493
[Fri May 13 13:49:53 2011] connected
[Fri May 13 13:49:55 2011] received
foo
Клиент:
$ perl -MIO::Socket::INET -E'
my $s = IO::Socket::INET->new(
PeerAddr => "127.0.0.1",
PeerPort => $ARGV[0],
) or die $!;
sleep 2;
say $s "foo";
' 39493
(Эти функции Perl - просто тонкие интерфейсы для системных вызовов. Не стесняйтесь переписывать их в C).