Koristis staru knjigu i stare primere, klijent server programi se vise tako ne pisu. Najbolje je da koristio IO::Socket ili cak xinetd (ako bash moras inetd) za server programe.
Ono sto si poslao izgleda da si editovao.
Koliko vidim prvi treba da dobije konekciju, forkuje child koji ce da nesto ispise klijentu i prekine vezu a on sam da nastavi i dalje da prima konekcije(while petlja).
Medjutim u tvom primeru i parent i child izlaze (exit) nakon prve konekcije? Samo child treba da ode kad zavrsi svoj posao, parent treba da ti ostane u while loop-u da bi mogao da dalje izvrsava zahteve. Ne znam zbog cega ce ti sleep za parent ?
[code:1:3dcc6f6785]
while(1) {
$remote = accept(NEWSOCKET, MY_SOCKET) || die "$0 Unacceptable $!n";
@remoteInfo = unpack($PACKIT,$remote);
$, = ' ';
print @remoteInfo; print "n";
# $pid = fork || &cleanup;
if ($pid == fork){# child
sleep 3;
print NEWSOCKET "Welcome to this servern";
close NEWSOCKET;
close MY_SOCKET;
exit;
}
else {# parent
sleep 10;
close MY_SOCKET;
close NEWSOCKET;# in parent
exit;
}
}
[/code:1:3dcc6f6785]
Komentari ti ne valjaju, ako dobijes $pid od forka to ti je master u suprotnom dobijas nulu i pitas da li je definisan $pid ako jeste to je child u suprotnom fork je bio neuspesan (ozbiljna greska koja se na srecu ne desava cesto). Dakle obrni komentare kako ti sada stoje.
Evo ti primer jednog fork daemona koji sam uradio za
www.modperldev.com[code:1:3dcc6f6785]
if ($pid = fork) {
# parent, child pid is in $pid
# carp "parent $$";
close STDOUT;
close STDIN;
close STDERR;
} elsif (defined $pid) { # $pid is defined and zero here
# child, parent is in getppid
# carp "child $$";
$SIG{INT} = "IGNORE";
open STDIN, "</dev/null";
open STDOUT,">/dev/null";
open STDERR,">/dev/null";
exec $line;
} else {
carp "Can not fork: $!n";
}
[/code:1:3dcc6f6785]
Takodje treba da napravis reaper f-ju koja ce da pokupi mrtvu decu (da ih ceka sa wait) da ne bi imao zombie procese.
Npr.
[code:1:3dcc6f6785]
$SIG{CHLD} = &REAPER;
sub REAPER {
my $stiff;
while (($stiff = waitpid(-1, &WNOHANG)) > 0) {
}
$SIG{CHLD} = &REAPER;
}
[/code:1:3dcc6f6785]
Za ovo ti treba POSIX modul a za one ispise Carp
[code:1:3dcc6f6785]
use POSIX ":sys_wait_h";
use Carp;
[/code:1:3dcc6f6785]