news.utdallas.edu!convex!tchrist Thu Feb 25 11:52:17 CST 1993
Article: 1074 of comp.lang.perl
Xref: feenix.metronet.com comp.lang.perl:1074
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.utdallas.edu!convex!tchrist
From: Tom Christiansen <[email protected]>
#Subject: Re: SUMMARY: Timeout on Connect
Originator: [email protected]
Sender: [email protected] (news access account)
Message-ID: <[email protected]>
Date: Thu, 18 Feb 1993 04:07:48 GMT
Reply-To: [email protected] (Tom Christiansen)
References: <[email protected]>
Nntp-Posting-Host: pixel.convex.com
Organization: Convex Computer Corporation, Colorado Springs, CO
Keywords: Summary, sockets, connect, timeouts
X-Disclaimer: This message was written by a user at CONVEX Computer
             Corp. The opinions expressed are those of the user and
             not necessarily those of CONVEX.
Lines: 38

>From the keyboard of [email protected] (Jack Stewart):
:There doesn't appear to be a way to make some sort of magic syscall to
:change the timeouts on the connect function either in C or perl.
:However the method that worked best for me was to fork a child and do
:all of the socket operations (including IO) within that child.  I
:could then kill the child if it had not finished in time.

:    if (!socket(S,$AF_INET,$SOCK_STREAM,$proto)) {die "$!\n;"}
:    if (!bind(S,$this)) {die "$!\n;"}
:    if (connect(S,$primary)) {

You don't have to use an extra process to zap the connect.  As when
you're timing out reads, send yourself an alarm.  Here's how I might
do it:

   $TIMEOUT = 15;
   sub Timer { die "Alarm Clock" }
   $SIG{ALRM} = Timer;

   socket(S, &AF_INET, &SOCK_STREAK, $proto)   || die "socket: $!";
   bind (S, $this)                             || die "bind: $!";

   eval {
       alarm($TIMEOUT);
       connect(S, $primary)                    || die "connect: $!";
       alarm(0);
   };

   if ($@ && $@ !~ /Alarm Clock/) {
       die $@;
   }

--tom
--
   Tom Christiansen      [email protected]      convex!tchrist


   The debate rages on: Is PL/I Bachtrian or Dromedary?