ronniec has asked for the wisdom of the Perl Monks concerning the following question:
#!perl -c ###################################################################### +### # $Id: wakeonlan,v 1.4 2000/08/01 03:38:59 jpo Exp $ + # # + # # Example here: perl wakeonlan_rob.pl 00:04:75:F4:8F:B6 + # ###################################################################### +### use strict; use Socket; use Getopt::Std; use vars qw($VERSION $opt_v $opt_h $opt_i $opt_p $opt_f); $VERSION = '0.40'; my $DEFAULT_IP = '255.255.255.255'; my $DEFAULT_PORT = getservbyname('discard', 'udp'); # # Process the command line # getopts("hvp:i:f:"); if ($opt_h) { usage(); exit(0); } if ($opt_v) { print "wakeonlan version $VERSION\n"; exit(0); } if (!$opt_f and !@ARGV) { usage(); exit(0); } if ($opt_i) { $DEFAULT_IP = $opt_i; } # override default if ($opt_p) { $DEFAULT_PORT = $opt_p; } # override default if ($opt_f) { process_file($opt_f); } # The rest of the command line are a list of hardware addresses foreach (@ARGV) { wake($_, $opt_i, $opt_p); } # # wake # # The 'magic packet' consists of 6 times 0xFF followed by 16 times # the hardware address of the NIC. This sequence can be encapsulated # in any kind of packet, in this case UDP to the discard port (9). # + sub wake { my $hwaddr = shift; my $ipaddr = shift || $DEFAULT_IP; my $port = shift || $DEFAULT_PORT; my ($raddr, $them, $proto); my ($hwaddr_re, $pkt); # Validate hardware address (ethernet address) $hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6); if ($hwaddr !~ m/^$hwaddr_re$/) { warn "Invalid hardware address: $hwaddr\n"; return undef; } # Generate magic sequence foreach (split /:/, $hwaddr) { $pkt .= chr(hex($_)); } $pkt = chr(0xFF) x 6 . $pkt x 16; # Alocate socket and send packet $raddr = gethostbyname($ipaddr); $them = pack_sockaddr_in($port, $raddr); $proto = getprotobyname('udp'); socket(S, AF_INET, SOCK_DGRAM, $proto) or die "socket : $!"; setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt : $! +"; print "Sending magic packet to $ipaddr:$port with $hwaddr\n"; send(S, $pkt, 0, $them) or die "send : $!"; close S; } # # process_file # sub process_file { my $filename = shift; my ($hwaddr, $ipaddr, $port); open (F, "<$filename") or die "open : $!"; while(<F>) { next if /^\s*#/; # ignore comments next if /^\s*$/; # ignore empty lines chomp; ($hwaddr, $ipaddr, $port) = split; wake($hwaddr, $ipaddr, $port); } close F; } # # Usage # sub usage { print <<__USAGE__; Usage wakeonlan [-h] [-v] [-i IP_address] [-p port] [-f file] [[hardware +_address] ...] Options -h this information -v dislpays the script version -i ip_address set the destination IP address default: 255.255.255.255 (the limited broadcast address) -p port set the destination port default: 9 (discard port) -f file uses file as a source of hardware addresses See also wakelan(1) __USAGE__ } __END__
Edited by planetscape - added readmore tags
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: How to make Wake Win32 work?
by markh (Scribe) on Oct 24, 2006 at 16:01 UTC | |
by EvanK (Chaplain) on Oct 24, 2006 at 17:08 UTC | |
by BrowserUk (Patriarch) on Oct 24, 2006 at 19:24 UTC | |
by EvanK (Chaplain) on Oct 25, 2006 at 03:24 UTC | |
by BrowserUk (Patriarch) on Oct 25, 2006 at 06:46 UTC | |
by ww (Archbishop) on Oct 24, 2006 at 18:22 UTC |