#!/usr/bin/perl
# serverfork.pl - a server that forks a child
# process to handle client connections
# use strict;
use IO::Socket;
use Sys::Hostname;
use POSIX qw(:sys_wait_h);
use Crypt::CBC;
sub REAP {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAP;
}
$SIG{CHLD} = \&REAP;
my $sock = new IO::Socket::INET(
LocalHost => 'localhost',
LocalPort => 9000,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1);
$sock or die "no socket :$!";
# STDOUT->autoflush(1);
my $cipher = Crypt::CBC->new( -key => '1234',
-cipher => 'Blowfish'
);
my($new_sock, $buf, $kid);
while ($new_sock = $sock->accept()) {
# execute a fork, if this is
# the parent, its work is done,
# go straight to continue
next if $kid = fork;
die "fork: $!" unless defined $kid;
# child now...
# close the server - not needed
close $sock;
while (defined($buf = <$new_sock>)) {
chop $buf;
server();
}
exit;
} continue {
# parent closes the client since
# it is not needed
close $new_sock;
}
sub server {
my $plaintext = $cipher->decrypt($buf);
my $in = "SERVER: Text: ".$plaintext;
my $ciphertext = $cipher->encrypt($in);
print($new_sock $ciphertext);
}
####
#!/usr/bin/perl
# use IO::Socket;
use Crypt::CBC;
my $sock = new IO::Socket::INET(
PeerAddr => 'localhost',
PeerPort => 9000,
Proto => 'tcp');
$sock or die "no socket :$!";
my $cipher = Crypt::CBC->new( -key => '1234',
-cipher => 'Blowfish'
);
# clientfork.pl - a client that forks to
# read from STDIN and write to a server
use strict;
use IO::Socket;
my $host = shift || 'localhost';
my $port = shift || 9000;
my $sock = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp');
$sock or die "no socket :$!";
$sock->autoflush(1);
my($in, $buf, $kid);
die "fork fail: $!" unless defined($kid = fork);
if ($kid) {
# parent reads from STDIN, prints to socket
while (defined($in = )) {
my $ciphertext = $cipher->encrypt($in);
print $ciphertext;
print $sock $ciphertext;
}
# kill the child process
kill(TERM => $kid);
} else {
# child reads from socket, prints to STDOUT
while (defined($buf = <$sock>)) {
my $plaintext = $cipher->decrypt($buf);
print $plaintext;
}
close $sock;
}
####
wmp@innocence:~/ISS/iss/daemon$ ./server.pl
Ciphertext does not begin with a valid header for 'salt' header mode at ./server.pl line 48
wmp@innocence:~/ISS/iss/daemon$