Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

timeout problem in IO::Socket #1197

Closed
p5pRT opened this issue Feb 18, 2000 · 2 comments
Closed

timeout problem in IO::Socket #1197

p5pRT opened this issue Feb 18, 2000 · 2 comments

Comments

@p5pRT
Copy link

p5pRT commented Feb 18, 2000

Migrated from rt.perl.org#2167 (status was 'resolved')

Searchable as RT2167$

@p5pRT
Copy link
Author

p5pRT commented Feb 18, 2000

From wilfredm@inet.kpn.com

Created by wmollenvanger@yahoo.com

The LWP library I'm using had problems with defined timeouts so I traced
it
back to IO​::Socket​::connect​:

sub connect {
  @​_ == 2 || @​_ == 3 or croak 'usage​: $fh->connect(NAME) or
$fh->connect(PORT, ADDR)';
  my $fh = shift;
  my $addr = @​_ == 1 ? shift : sockaddr_in(@​_);
  my $timeout = ${*$fh}{'io_socket_timeout'};
  local($SIG{ALRM}) = $timeout ? sub { undef $fh; }
  : $SIG{ALRM} || 'DEFAULT';

  eval {
  croak 'connect​: Bad address'
  if(@​_ == 2 && !defined $_[1]);

  if($timeout) {
  defined $Config{d_alarm} && defined alarm($timeout) or
  $timeout = 0;
  }

  my $ok = connect($fh, $addr);

  alarm(0)
  if($timeout);

  croak "connect​: timeout"
  unless defined $fh;

  undef $fh unless $ok;
  };

  $fh;
}

Shouldn't the line were the signal handler is defined read​:

local($SIG{ALRM}) = $timeout ? sub { undef $fh; die; }
  : $SIG{ALRM} || 'DEFAULT';

otherwise it will 'never' timeout on the connect() call.

Regards,

Wilfred.

Perl Info


Site configuration information for perl 5.00503:

Configured by root at Mon Aug 30 23:08:56 EDT 1999.

Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration:
  Platform:
    osname=linux, osvers=2.2.5-22smp, archname=i386-linux
    uname='linux porky.devel.redhat.com 2.2.5-22smp #1 smp wed jun 2
09:11:51 edt 1999 i686 unknown '
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef useperlio=undef d_sfio=undef
  Compiler:
    cc='cc', optimize='-O2', gccversion=egcs-2.91.66 19990314/Linux
(egcs-1.1.2
release)
    cppflags='-Dbool=char -DHAS_BOOL -I/usr/local/include'
    ccflags ='-Dbool=char -DHAS_BOOL -I/usr/local/include'
    stdchar='char', d_stdstdio=undef, usevfork=false
    intsize=4, longsize=4, ptrsize=4, doublesize=8
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    alignbytes=4, usemymalloc=n, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -ldl -lm -lc -lposix -lcrypt
    libc=, so=so, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'

    cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:



@INC for perl 5.00503:
    /usr/lib/perl5/5.00503/i386-linux
    /usr/lib/perl5/5.00503
    /usr/lib/perl5/site_perl/5.005/i386-linux
    /usr/lib/perl5/site_perl/5.005
    .


Environment for perl 5.00503:
    HOME=/export/home/wilfredm
    LANG=en_US
    LANGUAGE (unset)
    LC_ALL=en_US
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)

PATH=/usr/bin:/bin:/usr/X11R6/bin:/usr/local/bin:/opt/bin:/usr/X11R6/bin:/export/home/wilfredm/bin:/usr/local/ssh/bin:

    PERL_BADLANG (unset)
    SHELL=/bin/bash





@p5pRT
Copy link
Author

p5pRT commented Feb 18, 2000

From @gisle

Wilfred Mollenvanger <wilfredm@​inet.kpn.com> writes​:

-----------------------------------------------------------------
[Please enter your report here]
The LWP library I'm using had problems with defined timeouts so I traced
it back to IO​::Socket​::connect​:

sub connect {
@​_ == 2 || @​_ == 3 or croak 'usage​: $fh->connect(NAME) or
$fh->connect(PORT, ADDR)';
my $fh = shift;
my $addr = @​_ == 1 ? shift : sockaddr_in(@​_);
my $timeout = ${*$fh}{'io_socket_timeout'};
local($SIG{ALRM}) = $timeout ? sub { undef $fh; }
: $SIG{ALRM} || 'DEFAULT';

 eval \{
    croak 'connect&#8203;: Bad address'
        if\(@&#8203;\_ == 2 && \!defined $\_\[1\]\);

    if\($timeout\) \{
        defined $Config\{d\_alarm\} && defined alarm\($timeout\) or
            $timeout = 0;
    \}

    my $ok = connect\($fh\, $addr\);

    alarm\(0\)
        if\($timeout\);

    croak "connect&#8203;: timeout"
        unless defined $fh;

    undef $fh unless $ok;
\};

$fh;

}

Shouldn't the line were the signal handler is defined read​:

local($SIG{ALRM}) = $timeout ? sub { undef $fh; die; }
: $SIG{ALRM} || 'DEFAULT';

otherwise it will 'never' timeout on the connect() call.

The latest version of IO​::Socket, which is bundled with perl5.5.650
(perl's latest development release) will use non-blocking connect
instead of alarm. You can can achieve the same with perl5.005_03 by
installing IO-1.20 from CPAN.

I don't know if perl5.005_04 if/when it comes out will try to upgrade
the IO modules, but I doubt it.

Regards,
Gisle

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant