For Programmers: Free Programming Magazines  


Home > Archive > PERL Modules > September 2006 > Net-DHCPClient cant get timeout









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Net-DHCPClient cant get timeout
Raphael Koechlin

2006-09-12, 6:57 pm

hi there!

i need to know wheter or not a dhcp server is in the net of a certain
interface.

the following script works if there IS a dhcp but if there is NO dhcp
the script hangs ( as i found out in the [ loop $pcap, 1, sub { ]
function.

any ideas how i could get a timeout?

thank you!

raphael

heres my test script:

#!/usr/bin/perl
use Net::DHCPClient;
$macad = '00:0D:B9:03:9F:B9';
my $dhcp = new Net::DHCPClient( macaddr => $macad,
interface => 'eth1',
timeout => 3,
debug => 0,
);
$dhcp->discover( 61 => $macad );
print $dhcp->domain_name();

Sisyphus

2006-09-13, 7:57 am


"Raphael Koechlin" <djdomen@gmail.com> wrote in message
news:1158082626.002932.193490@i3g2000cwc.googlegroups.com...
> hi there!
>
> i need to know wheter or not a dhcp server is in the net of a certain
> interface.
>
> the following script works if there IS a dhcp but if there is NO dhcp
> the script hangs ( as i found out in the [ loop $pcap, 1, sub { ]
> function.
>

..
..
>
> #!/usr/bin/perl
> use Net::DHCPClient;
> $macad = '00:0D:B9:03:9F:B9';
> my $dhcp = new Net::DHCPClient( macaddr => $macad,
> interface => 'eth1',
> timeout => 3,
> debug => 0,
> );
> $dhcp->discover( 61 => $macad );
> print $dhcp->domain_name();
>


It's a good idea to enable warnings - especially if a script is giving
problems. (I don't know whether that will help in this case.) Also possibly
worth establishing at just which point the script hangs.
Does it hang at the new() call, the discover() call or the domain_name()
call ?

Additionally, see perldoc -f alarm.

Assuming that the script hangs on the new call (untested):

-----------
#!/usr/bin/perl
use warnings;
use Net::DHCPClient;
my $macad = '00:0D:B9:03:9F:B9';

alarm(3);
my $dhcp = new Net::DHCPClient( macaddr => $macad,
interface => 'eth1',
timeout => 3,
debug => 0,
);
alarm(0);
$dhcp->discover( 61 => $macad );
print $dhcp->domain_name();
----------

Cheers,
Rob






Raphael Koechlin

2006-09-13, 7:57 am

thanks!

obviously the alarm function is not working correctly on my system. its
an embedded device (wrap).

i also tried it with eval as suggested in
http://perldoc.perl.org/functions/alarm.html

the script hangs at the discover function where net::dhclient scans
incoming packets.
a simple
alarm 2;sleep 10; gives an alarm though.

strange...

is there any other possibility to generate a timeout without the alarm
function?

thanks

> It's a good idea to enable warnings - especially if a script is giving
> problems. (I don't know whether that will help in this case.) Also possibly
> worth establishing at just which point the script hangs.
> Does it hang at the new() call, the discover() call or the domain_name()
> call ?
>
> Additionally, see perldoc -f alarm.
>
> Assuming that the script hangs on the new call (untested):
>
> -----------
> #!/usr/bin/perl
> use warnings;
> use Net::DHCPClient;
> my $macad = '00:0D:B9:03:9F:B9';
>
> alarm(3);
> my $dhcp = new Net::DHCPClient( macaddr => $macad,
> interface => 'eth1',
> timeout => 3,
> debug => 0,
> );
> alarm(0);
> $dhcp->discover( 61 => $macad );
> print $dhcp->domain_name();
> ----------
>
> Cheers,
> Rob


Sisyphus

2006-09-13, 7:57 am


"Raphael Koechlin" <djdomen@gmail.com> wrote in message
..
..
> obviously the alarm function is not working correctly on my system.


Sheesh ... it even works on Win32 (to an extent :-)
..
..
>
> the script hangs at the discover function where net::dhclient scans
> incoming packets.


So ... does "if($dhcp)" return true ? ... even if there's no dhcp ?

I'm thinking it does - otherwise $dhcp->discover() would throw an error
about not being able to call method discover. But I'm not entirely sure
about that, and if it turns out that $dhcp is a false value, then maybe
there's the key to determining that there's no dhcp server available.

ie you could just write:

my $dhcp = new Net::DHCPClient( macaddr => $macad,
interface => 'eth1',
timeout => 3,
debug => 0,
) or die "No dhcp server available";

Next bright idea:
We find that sub discover() looks like this:

-----------------------
sub discover {
my $self = shift;
my %options = @_;

$self->ciaddr( 0 );
$self->yiaddr( 0 );
$self->siaddr( 0 );
$self->giaddr( 0 );

$options{53} = '1';

$self->doit( \%options );
}
-----------------------

You could insert debug print statements within it to determine just where
the hang occurs. (I don't know if that would achieve anything.)

Finally, you could peruse
http://search.cpan.org/search?query=dhcp&mode=dist to see if there's a
better alternative to Net::DHCPClient. All of the other modules listed there
are more recent than Net::DHCPClient.

I think that's about it, for my bright ideas :-)

> a simple
> alarm 2;sleep 10; gives an alarm though.


'perldoc -f alarm' warns about mixing 'alarm' and 'sleep' calls. (But, yes
.... that's about the extent to which it works on Win32 :-)

Cheers,
Rob


Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com