package Net::Wake;
use strict;
use IO::Socket;
use vars qw($VERSION);
$VERSION = '0.02';
=head1 NAME
Net::Wake - A package to send packets to power on computers.
=head1 SYNOPSIS
To send a wake-on-lan packet via UDP:
Net::Wake::by_udp('255.255.255.255', '00:00:87:A0:8A:D2');
Or directly from the command line:
perl -MNet::Wake -e "Net::Wake::by_udp(undef,'00:00:87:A0:8A:D2')"
=head1 DESCRIPTION
This package sends wake-on-lan (AKA magic) packets to turn on machines that
are wake-on-lan capable.
For now there is only one function in this package:
Net::Wake::by_udp([$host], $mac_address, [$port]);
You can omit the colons in the $mac_address, but not leading zeros.
Generally speaking, you should use a broadcast address for $host.
Using the host's last known IP address is usually not sufficient
since the IP address may no longer be in the ARP cache.
A $host value of '255.255.255.255' is implied if $host is undef.
If you wish to send a magic packet to a remote subnet,
you can use a variation of '192.168.0.255', given that you know
the subnet mask to generate the proper broadcast address.
=head1 SEE ALSO
http://gsd.di.uminho.pt/jpo/software/wakeonlan/mini-howto/
=head1 COPYRIGHT
Copyright 1999-2003 Clinton Wong
This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.
=cut
sub by_udp {
my ($host, $mac_addr, $port) = @_;
# use the discard service if $port not passed in
if (! defined $host) { $host = '255.255.255.255' }
if (! defined $port || $port !~ /^\d+$/ ) { $port = 9 }
my $sock = new IO::Socket::INET(Proto=>'udp') || return undef;
my $ip_addr = inet_aton($host);
my $sock_addr = sockaddr_in($port, $ip_addr);
$mac_addr =~ s/://g;
my $packet = pack('C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16);
setsockopt($sock, SOL_SOCKET, SO_BROADCAST, 1);
send($sock, $packet, 0, $sock_addr);
close ($sock);
return 1;
}
1;