Hallo,ich kann leider nicht programmieren, sonder arbeite nur mit Versatzstücken aus dem Internet: Ich habe ein ASP-Script, welches vom Webserver zuverlässig einen PC aufwecke (Wake on LAN).
Ein Perl-Script auf dem Webserver funktioniert dagegen nicht.
In beiden Fällen wird ein WOL-Paket an die IP-Adresse des aufzuweckenden PCs 192.168.0.55 verschickt und kommt dort auch identisch an (jedenfalls zeigt ein WOL-Monitor auf diesem Rechner völlig identische eintreffende Pakete).
Nun habe ich beobachtet, dass der WOL-Monitor auf _allen_ PCs im Netzwerk das WOL-Paket registriert, wenn das ASP-Script das "WOL" durchführt. Dabei meldet das ASP-Script: Magic Paket sent to MACADR at Broadcast Address 192.168.0.255.
Bei dem Perl-Script dagegen registriert der WOL-Monitor nur dann das WOL-Paket, wenn er auf dem PC mit der IP 192.168.0.55 läuft.
Ich vermute, dass das Perl-Script das Paket direkt an diese Adresse schickt, was nicht funktioniert, wenn dieser PC aus ist. Vielleicht leitet der Router es dann nicht weiter.
Das ASP-Script dagegen macht einen echten Rundruf an 192.168.0.xxx.
Wie müsste das Perl-Script angepasst sein, um ebenfalls einen echten Broadcast auszulösen?
Das Perl-Script wird über diese HTML-Seite aufgerufen:
<HTML>
<HEAD>
<TITLE>Wake-on-LAN</TITLE>
</HEAD>
<BODY bgcolor="#FFFFFF">
<div align="left">
<form method="POST" action="wakeup.pl">
<input type="text" name="HWaddress" size="20" value="00:1E:37:C2:13:60">
<input type="text" name="IPaddress" size="20" value="192.168.0.55">
<input type="text" name="Port" size="20" value="7">
<input type="submit" value="Wake-On-LAN">
</form>
</div>
</BODY>
</HTML>
Das Script selber:
#!/usr/bin/perl -wuse strict;
use Socket;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
$cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN');
print $cgi->header(-type =>'text/html'),
$cgi->start_html('Wakeup'),
$cgi->h1('Wakeup'),
wake($cgi->param('HWaddress'),$cgi->param('IPaddress'),$cgi->param('Port')),
$cgi->end_html();
sub wake
{
my $hwaddr = shift;
my $ipaddr = shift || '255.255.255.255';
my $port = shift || getservbyname('discard', 'udp');
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$/) {
return $cgi->p({-style => 'color:red'}, "Invalid hardware address: $hwaddr" );
}
# Generate magic sequence
foreach (split /:/, $hwaddr) {
$pkt .= chr(hex($_));
}
$pkt = chr(0xFF) x 6 . $pkt x 16;
# Allocate socket and send packet
$raddr = gethostbyname($ipaddr);
$them = pack_sockaddr_in($port, $raddr);
$proto = getprotobyname('udp');
if(!socket(S, AF_INET, SOCK_DGRAM, $proto)) {
return $cgi->p({-style => 'color:red'}, "socket : $!");
}
if(!setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)) {
return $cgi->p({-style => 'color:red'}, "setsockopt : $!" );
}
if(!send(S, $pkt, 0, $them)) {
return $cgi->p({-style => 'color:red'}, "send : $!");
}
close S;
return $cgi->p("Sending magic packet to $ipaddr:$port with $hwaddr");
}
Datum: 24.08.2008-17:46
