use strict;
use warnings;
use Socket;

while (@ARGV)
  {	send_wol_packet(shift(@ARGV),shift(@ARGV)); }

sub send_wol_packet
  {
	my $mac = shift;
  my $ip = shift;
  my $iaddr;
  
	die "Fehler in MAC-Addrese $mac\n"
     if ($mac !~ /([0-9a-f]{2}:){5}[0-9a-f]{2}/i);

  die "Fehler in IP-Adresse $ip\n"
	  if (! defined($iaddr = inet_aton($ip)));

	# ARP-Eintrag schreiben
	if ($^O =~ /MSWIn/) 
	  { $mac =~ s/:/-/g; }      # NUR bei Windows
	system("arp -s $ip $mac") == 0
		or die "Warning: arp command failed, you need to be root\n";

	# Doppelpunkte entfernen
	$mac =~ tr/://d;            # fuer Linux
	$mac =~ tr/-//d;            # fuer Windows

	# Magic packet: 6 x FF, 16 x MAC-Adresse
	my $magic = ("\xff" x 6) . (pack('H12', $mac) x 16);

	# Create socket
	socket(S, PF_INET, SOCK_DGRAM, getprotobyname('udp'))
		 or die "Oops - Socket: $!\n";

	# Paket senden
	die "Oops - Send: $!\n" unless
	   defined(send(S, $magic, 0, sockaddr_in(0x2fff, $iaddr)));
	close(S);
  }
