Am Mittwoch, 6. April 2005 12.52 schrieb gui:
> John Doe wrote:
> > I don't see the exact reason. But after having a look in the code
> > (Perl.pm, sub _create_socket, which tries ports from 1023 down to 512 to
> > bind to), maybe the ssh object is not destroyed between the loops. You
> > could try:
> >
> > ** define $ssh as my variable within the loop (not outside as currently)
> > ** put the code within the loop in a separate block, containing the
> > my-Definition of $ssh
> > ** use "undef $ssh" at the end of the loop (still within it of course)
> > ** Insert some diagnostic code at the beginning of the loop that
> > a) examines the $ssh object before the second "loop run" and/or
> > b) sleeps for e.g. a minute, so that you can look whats happening with
> > the bound port (netstat -neat from cmdline)
> >
> > I don't have the Modules installed, so I didn't made tests, sorry.
> >
> > joe
>
> I tried some of your recommendations, like declaring $ssh in the loop
> and use "undef $ssh" at the end, but didn't solve the problem.
> I did use netstat -neat during, and after the script launch. I didn't
> see anything weird during the script running, I did see something
> bizarre after :
>
> tcp        0      0 192.168.0.3:1023        192.168.0.1:22
> TIME_WAIT  0          0
>
> that line, stayed there for at least a full minute before disappearing.
> So I decided to add a 2min sleep at the end of the loop... and to my
> surprise : IT WORKED!
> I used netstat during the 2min sleep, it seems that the connection to
> the 1023 socket lasts something between 1-2 minutes.
>
> It's weird, I wish there were another way around it. If anybody got an
> explanation or a better solution about this "socket bind for more than a
> minute, than just disappears" enigma, I'd be glad.

This phenomen with the TIME_WAIT was my other thought to explain the behavior 
of your script, but then I decided not to mention it because I thought that 
the sub _create_socket code in Perl.pm will handle this:

*---- code ----*
sub _create_socket {
    my $ssh = shift;
    my $sock = gensym;

 my ($p,$end,$delta) = (0,1,1); # normally we use whatever port we can get
       ($p,$end,$delta) = (1023,512,-1) if $ssh->{config}->get('privileged');

 # allow an explicit bind address
    my $addr = $ssh->{config}->get('bind_address');
 $addr = inet_aton($addr) if $addr;
 ($p,$end,$delta) = (10000,65535,1) if $addr and not $p;
 $addr ||= INADDR_ANY;

    for(; $p != $end; $p += $delta) {
        socket($sock, AF_INET, SOCK_STREAM, getprotobyname('tcp') || 0) ||
            croak "Net::SSH: Can't create socket: $!";
        last if not $p or bind($sock, sockaddr_in($p,$addr));
        if ($! =~ /Address already in use/i) {
            close($sock);
            next;
        }
        croak "Net::SSH: Can't bind socket to port $p: $!";
    }
 if($p) {
  $ssh->debug("Allocated local port $p.");
  $ssh->{config}->set('localport', $p);
 }

    $sock;
}

*--- code ---*

The code tries to bind to several ports (1023 down to 512).

But now, when I look again - but still not deeply enough!... (and use the hint 
the port 1023 was also tried in the _second_ "loop run")... the code seems 
only to handle the "port already in use" case...

Please look at the above code deeper... the croak code could be the problem, 
and a possibility could be not to croak so fast, but try port after port 
until binding has been done or the port range has fully be tested.

I could have a deeper look myself tomorrow ...äh... après-midi, if you wish 
(we're located in the same time zone I think).

btw - where are all the cracks who have the 
instant-shortestpossible-100%solution for all ???

greetings joe

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to