can't locate method new IO::Socket::INET

Discussion in 'Perl Misc' started by ten8ciousb, Sep 28, 2006.

  1. ten8ciousb

    ten8ciousb Guest

    Sometimes, not always, an attempt to create a new socket connection
    fails with this message:
    Socket::INET" (perhaps you forgot to load "IO::Socket::INET"?) at
    /usr/local/lib/perl5/5.6.1/IO/Socket/INET.pm line 32

    Any ideas why or how INET.pm fails saying it can't find new in INET.pm?
    The script runs on many servers many times a day, but only fails on one
    and generally about the same time of the day. Okay. Seems kind of
    obvious that is something specific to the server and the time of day.
    But, within the same script there are multiple calls to create sockets
    to different servers and they complete successfully.

    I'm kind of out of my element on the internals of perl here, but my
    thoughts:
    Is it trying to find IO::Socket::INET.pm in @INC in order to identify
    the super class, which is IO::Socket?
    Does that mean that @INC has somehow become 'corrupted' during runtime?

    any other thoughts.
    Or has perl's symbol table become corrupted so it doesn't know what
    "new" is?


    nothing fancy in the script:

    use IO::Socket;
    use IO::Socket::INET;

    $sock = IO::Socket::INET->new(
    PeerAddr => $host,
    PeerPort => $port,
    Proto => 'tcp',
    );

    for reference : in INET.pm:
    @ISA = qw(IO::Socket);
    ....
    sub new {
    my $class = shift;
    unshift(@_, "PeerAddr") if @_ == 1;
    return $class->SUPER::new(@_); ### Here's line 32

    }
     
    ten8ciousb, Sep 28, 2006
    #1
    1. Advertisements

  2. ten8ciousb

    Sisyphus Guest

    ..
    ..
    Pretty much stumped by this. (The *full* error message as a copy'n'paste
    could be helpful as that would remove *all* guesswork on our part.)

    Normally you don't 'use IO::Socket::INET;' - you just 'use IO::Socket;'. I
    can't think of why that would stuff things up, but it's a change you could
    try.

    Cheers,
    Rob
     
    Sisyphus, Sep 29, 2006
    #2
    1. Advertisements

  3. ten8ciousb

    ten8ciousb Guest


    Thanks for the reply.
    It originally just had use IO::Socket, I added the use
    IO::Socket::INET, just to make sure it was loaded.
    I've added a die handler that prints a stack trace which I'm hoping
    gives a little more information than just the "or die print $!"; So,
    now I'm just waiting for it to fail again.

    Here's another little bit of information, which also doesn't make sense
    to me.
    This problem happened at the same site over 2 1/2 years ago. Because
    the script creates mutiple sockets, I wasn't sure which subroutine it
    was in when it died. So, I added some print "in sub xxxx" statements
    to each subroutine. While running with that "debug" script, the error
    didn't occur. All I did was add print statements. Now, same site but
    a new server and the print statements aren't helping anymore.
     
    ten8ciousb, Sep 29, 2006
    #3
  4. ten8ciousb

    Sisyphus Guest

    ..
    ..
    Sounds like something might be configured a little differently on the new
    server and the print()ing is going somewhere else. Try opening a filehandle
    to a log file, and have the debug statements print() to that filehandle.

    (Or perhaps those print statements are already being written to some error
    log ?)

    Cheers,
    Rob
     
    Sisyphus, Sep 29, 2006
    #4
  5. ten8ciousb

    ten8ciousb Guest

    I only mentioned the print statements because I thought it was strange
    that they magically made the problem go away. The debugging print
    statements still show up in the log, but whatever effect they were
    having before, which prevented the "Can't locate.." message, they
    aren't having now. The only thing that I can think they did was slow
    down the execution of the program.
     
    ten8ciousb, Oct 2, 2006
    #5
  6. You could use eval to check whether a module is loaded:

    eval ('use aModule;');
    die 'aModule not loaded' if $@;
    Not sure if this would make any difference, but saying use lib
    '/path/to/...'; in the beginning of your script wouldn't harm.

    You could also tell the program to explicitly run under Perl 5.6.1.

    Maybe there is a lock or buffering issue while reading INET.pm into
    memory with mutliple sockets. There's a note from the IO::Socket and
    IO::Socket::INET man pages saying:

    "As of VERSION 1.18 all IO::Socket objects have autoflush turned
    on by default. This was not the case with earlier releases."

    Just some ideas - maybe it helps.
     
    Bart Van der Donck, Oct 2, 2006
    #6
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.