2

クライアント:

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

私の質問:

サーバーselect()(または)が完了すると、システムバッファーcan_readの内容についてどのような保証がありますか?receive単一の「a」を含めることは可能ですか?または「abel\nbak」?または、システムバッファには、クライアントの対応する「print」ステートメントから送信された文字列の1つ、2つ、または3つすべてが含まれることが保証されていますか?

これは明らかに、アプリケーションレベルのバッファを管理する方法に影響を及ぼします。

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 に答える