客户:
$socket->autoflush(1);
print $socket "abel\n";
print $socket "baker\n";
print $socket "charlie\n";
我的问题:
当服务器的select()
(或can_read
)完成时,我对系统receive
缓冲区的内容有什么保证?它可能包含一个“a”吗?还是“abel \ nbak”?或者系统缓冲区保证是否包含从客户端中相应的“print”语句发送的一个,两个或全部三个字符串?
这显然会影响我如何管理应用程序级缓冲区。
答案 0 :(得分:2)
TCP(和一般的SOCK_STREAM)没有这样的保证。您列出的任何内容都是可能的。
答案 1 :(得分:0)
没有保证。 ""和" abel \ nbak"都是可能的。
如果有可用的数据, sysread
不会阻止;它将返回可用的内容。因此,您可以使用
for my $fh (@ready) {
my $close = 0;
my $client = $clients{$fh};
our $buf; local *buf = $client->{buf};
my $rv = sysread($buf, 0, 64*1024, length($buf));
if ($rv) {
while ($buf =~ s/^(.*)\n//) {
my $msg = $1;
$close = 1 if process_msg($msg);
}
} else {
$close = 1;
# Handle error and eof here.
}
if ($close) {
$readers->delete($fh);
delete $clients->{$fh};
}
}