Lösung mit einem Prozeß VII

 [Vorheriges Kapitel]  [Vorherige Seite]  [Inhaltsverzeichnis]  [Nächste Seite]  [Nächstes Kapitel]

chatserver.pl
sub handle_read {
   my $handle = shift;
   my $buffer = "";
   if (defined(sysread($handle, $buffer, 8192))) {
      my $handler = $handler{$handle};
      $handler->{ibuf} .= $buffer;
      if ($handler->{ibuf} =~ /^(.*\n)(.*)/s) {
         if ($1 =~ /^\r?\n$/) {
            &{$handler->{readline}}($handle, "");
         } else {
            foreach my $line (split /\r?\n/, $1) {
               &{$handler->{readline}}($handle, $line);
            }
         }
         $handler->{ibuf} = $2;
      }
   } else {
      quit($handle);
   }
}

*handle_read arbeitet mit sysread, das direkt auf read(2) zurückgeht, um die internen Eingabepuffer von Perl zu umgehen (select(2) funktioniert dafür nicht).
 
*read(2) bietet ferner das Entgegenkommen, auch dann weniger zurückzuliefern (nämlich genau das, was im Betriebssystemskern zur Verfügung steht), wenn mehr gefordert wird (hier: 8192 Bytes).
 

 [Vorheriges Kapitel]  [Vorherige Seite]  [Inhaltsverzeichnis]  [Nächste Seite]  [Nächstes Kapitel]
Copyright © 1996 - 2003 Andreas Borchert, in HTML konvertiert am 01.10.2003