use strict; use warnings; use Log::Handler; use IO::Socket::INET; my $log = Log::Handler->new(   filename => \*STDOUT,   newline  => 1,   maxlevel => 'info',   prefix   => "[<--LEVEL-->] server($$) ", ); my $socket = IO::Socket::INET->new(   LocalHost  => '127.0.0.1',   LocalPort  => 50010,   Type       => SOCK_STREAM,   Listen     => 10,   Reuse      => 1, ) or die "server: can't open socket over port 50010"; my %commands = (   date => \×tamp, ); while (my $client = $socket->accept()) {   my $peerhost = $client->peerhost;   my $peerport = $client->peerport;   $log->info("reqeust from client $peerhost on port $peerport");   $log->info("forking a child now");   my $pid = fork; # der Server wird geforkt   next if $pid;   # der Server springt zum Anfang der Schleife   # ---------------------------------------------------------   # das ist der Child   # ---------------------------------------------------------   $log->set_prefix("[<--LEVEL-->] child($$) peerhost($peerhost) peerport($peerport): ");   $log->info("i'm startet");   while (my $request = <$client>) {      chomp $request;      if ($request eq 'exit') {         $log->info("client closed connection");         last;      } elsif ($request =~ /^\w+\z/ && exists $commands{$request}) {         $log->info("client request: $request");         my $response = $commands{$request}();         print $client $response, "\n";      } else {         $log->warn("bad request from client");         print $client "bad command\n";      }   }   close $client;   exit unless $pid; # exit, damit $socket ausserhalb der Schleife nicht geschlossen wird   # --------------------------------------------------------- } close($socket); sub timestamp {   my @t = (localtime)[reverse 0..5];   $t[0] += 1900;   $t[1] += 1;   return sprintf '%02d:%02d:%02d %02d.%02d.%04d', @t[3..5], reverse @t[0..2]; }