#!/usr/local/bin/perl use IO::Socket; use Time::localtime; $port = 7654; $maxspoj = SOMAXCONN; sub calc { $oper = shift; $op1 = shift; $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 "SER: [",ctime,"] Inicializace. Port: $port. Max. spojeni: $maxspoj\n"; binmode(STDOUT); while ($klient = $server->accept) { print "SER: [",ctime,"] Socket klienta vytvoren.\n"; $klient->autoflush(1); # ocekava se pozadavek ve forme "CALC klientID x[+-*/]y" @poz = split(' ',<$klient>); $prefix = $poz[0]; $klID = $poz[1]; $vyraz = $poz[2]; # platny prefix? reaguj jen na CALC! if ($prefix eq "CALC" && $vyraz !~ /^$/) { $vyraz =~ /(.+)([\+\-\*\/])(.+)/; $op1 = $1; $oper = $2; $op2 = $3; print "SER: [",ctime," Klient $klID] Pozadavek: $op1 $oper $op2\n"; sleep(5); $vysl = calc($oper,$op1,$op2); print "SER: [",ctime," Klient $klID] Vysledek: $vysl. Odesilam klientovi.\n"; print $klient "RSLT $vysl\n"; } else { # Spatny pozadavek print "SER: [",ctime," Klient $klID] Zaslan spatny pozadavek. Odesilam chybovou zpravu.\n"; print $klient "RSLT ERR\n"; } print "SER: [",ctime," Klient $klID] Zaviram socket klienta.\n"; close $klient; } print "SER: [",ctime," Klient $klID] Konec\n\n\n"; close $server;