#!/usr/bin/perl -w
use strict;
use IO::Socket;
use Sys::Hostname;
use POSIX qw(:sys_wait_h);
sub REAP {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAP;
}
$SIG{CHLD} = \&REAP;
my $sock = new IO::Socket::INET(
LocalHost => '127.0.0.1',
LocalPort => 9898,
Proto => 'tcp',
Listen => 10,
Reuse => 1);
$sock or die "no socket :$!";
STDOUT->autoflush(1);
STDERR->autoflush(1);
my($new_sock, $buf, $kid);
print STDERR "Parent $$: Server up\n";
while ($new_sock = $sock->accept()) {
next if $kid = fork;
die "fork: $!" unless defined $kid;
# child now...
print STDERR "Child $$\n";
# close the passive socket - not needed
$sock->shutdown(2);
# read from client
$buf = <$new_sock>;
$new_sock->shutdown(0);
chomp $buf;
print "Child $$: Read from client: $buf\n";
print $new_sock "READY\n";
print "Child $$: Sent READY, closing\n";
$new_sock->shutdown(2);
exit;
} continue {
# parent closes the client since
# it is not needed
print STDERR "Parent $$: Closing child socket\n";
close $new_sock;
}
print STDERR "Parent $$: Should never get here\n";
####
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
my $me = 'some_client';
my $socket = IO::Socket::INET->new( PeerAddr => '127.0.0.1',
PeerPort => '9898',
Proto => 'tcp',
Type => SOCK_STREAM )
or die "Couldn't connect to 127.0.0.1:9898: $@\n";
$socket->autoflush(1);
print $socket "$me $$\n";
# no more writing from here
$socket->shutdown(1);
my $line = <$socket>;
chomp $line;
print STDOUT "$line\n";
$socket->close;
exit 1 unless $line eq 'SUCCESS';
exit 0;
####
Parent 11124: Server up
Parent 11124: Closing child socket
Child 11131
Parent 11124: Should never get here
Child 11131: Read from client: some_client 11130
Child 11131: Sent READY, closing