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