2

客户端:

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

我的问题:

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

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

4

2 回答 2

2

TCP(和一般的 SOCK_STREAM)没有这样的保证。您列出的任何内容都是可能的。

于 2013-01-13T21:46:09.883 回答
0

没有任何保证。"a" 和 "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};
   }
}
于 2013-01-14T00:52:55.030 回答