Article 3181 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:3181
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.ecn.bgu.edu!wupost!howland.reston.ans.net!xlink.net!news.belwue.de!news.uni-ulm.de!huober_j
From: huober_j@oracle.rz.uni-ulm.de (Joachim Huober)
Subject: Re: socket SO_KEEPALIVE example needed
Message-ID: <1993Jun4.093430.26579@wega.rz.uni-ulm.de>
Keywords: perl socket IPC KEEPALIVE tcp
Sender: huober_j@oracle (Joachim Huober)
Organization: Universitaet Ulm
References:  <1501@pascal.einstein.eds.com>
Date: Fri, 4 Jun 1993 09:34:30 GMT
Lines: 63

Sorry but I can't mail to 'mcleod@einstein.eds.com' (Returned mail: Host unknown)
so I post here:

The following works fine for me:

#! /usr/bin/perl

require 'sys/socket.ph';
require 'sys/wait.ph';
($server,$port) = @ARGV;
$port = 2350 unless $port;
$server = 'echo server not specified' unless $server;

$SIG{'CHLD'} = 'childhdl';

sub childhdl
{
        local($pid) = waitpid(-1,&WNOHANG);
}
$socketaddr = 'S n a4 x8';

(($name, $aliases, $proto) = getprotobyname('tcp')) || die;
((($name, $aliases, $port) = getservbyname($port, 'tcp')) || die)
        unless $port =~ /^\d+$/;
$this = pack($socketaddr, &AF_INET, $port, "\0\0\0\0");

select(NS); $| = 1; select(stdout);

socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!";
bind(S, $this) || die "bind: $!";
listen(S, 5) || die "listen: $!";

select(S); $| = 1; select(STDOUT);
for (;;) {
        until (defined($addr = accept(NS,S)))
        {}
        if ($child = fork)
        {
                close(NS);
        }
        elsif (defined($child))
        {
                setsockopt(NS,&SOL_SOCKET,&SO_KEEPALIVE,undef,undef) || warn "setsockopt: $!";

                open(STDIN,"<&NS") || die "open: $!";
                open(STDOUT,">&NS") || die "open: $!";

                exec($server) || die "exec $!";
                close(NS);
                exit;
        }
        else
        {
                warn "Can't fork $!";
                close(NS);
        }
}


Hope this helps :-)

                                                Yours Joachim