#!/usr/local/bin/perl use IO::Socket; use Time::localtime; $port = 7654; $maxspoj = SOMAXCONN; sub calc { my $oper = shift; my $op1 = shift; my $op2 = shift; if ($oper eq "+") { $vysl = $op1 + $op2; } elsif ($oper eq "-") { $vysl = $op1 - $op2; } elsif ($oper eq "*") { $vysl = $op1 * $op2; } elsif ($oper eq "/") { $vysl = $op1 / $op2; } else { $vysl = "ERR"; } return $vysl; } $server = IO::Socket::INET->new(Proto=>"tcp", LocalPort=>$port, Listen=>$maxspoj, Reuse=>1) or die "Nelze vytvorit server.\n\n"; print "\nSER: [",ctime,"] Inicializace.\nPort: $port.\nMax. spojeni: $maxspoj\n"; binmode(STDOUT); sub REAPER { $waitpid = wait; $SIG{CHLD} = \&REAPER; # print "Reaped $waitpid" . ($? ? " with exit $?" : ''); } $SIG{CHLD} = \&REAPER; while ($klient = $server->accept) { print "SER: [",ctime,"] Socket klienta vytvoren.\n"; $klient->autoflush(1); if (($pid = fork) == 0) { # ocekava se pozadavek ve forme "CALC klientID x[+-*/]y" @poz = split(' ',<$klient>); $prefix = $poz[0]; $klID = $poz[1]; $vyraz = $poz[2]; print "SER: [",ctime," $klID] FORK: Zacatek.\n"; # platny prefix? reaguj jen na CALC! if ($prefix eq "CALC" && $vyraz !~ /^$/) { $vyraz =~ /(.+)([\+\-\*\/])(.+)/; $op1 = $1; $oper = $2; $op2 = $3; print "SER: [",ctime," $klID] Pozadavek: $op1 $oper $op2\n"; sleep(5); $vysl = calc($oper,$op1,$op2); print "SER: [",ctime," $klID] Vysledek: $vysl. Odesilam klientovi.\n"; print $klient "RSLT $vysl \n"; } else { # Spatny pozadavek print "SER: [",ctime," $klID] Zaslan spatny pozadavek. Odesilam chybovou zpravu.\n"; print $klient "RSLT ERR \n"; } print "SER: [",ctime," $klID] Zaviram socket klienta.\n"; close $klient; # print "SER: [",ctime," $klID] Zaviram socket serveru.\n"; # close $server; die "SER: [",ctime," $klID] FORK: Konec."; } else { close $klient; } } print "SER: [",ctime,"] Zaviram socket serveru a konec.\n\n\n"; close $server;