Perl TCP,打印,选择和sysread - 缓冲行为

时间:2013-01-13 21:43:44

标签: perl tcp buffer

客户:

$socket->autoflush(1);
print $socket "abel\n";
print $socket "baker\n";
print $socket "charlie\n";

我的问题:

当服务器的select()(或can_read)完成时,我对系统receive缓冲区的内容有什么保证?它可能包含一个“a”吗?还是“abel \ nbak”?或者系统缓冲区保证是否包含从客户端中相应的“print”语句发送的一个,两个或全部三个字符串?

这显然会影响我如何管理应用程序级缓冲区。

2 个答案:

答案 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};
   }
}