WOL per Skript funktioniert auf einmal nicht mehr

. 255 ist eigentlich die Broadcast Adresse, die kann dein Gerät nicht haben.

Hab eben das gefunden :

Wake On Lan: fsockopen - Keine Berechtigung

Gesendet von iPad mit Tapatalk

Das passt.

Das Magic-Packet wird per Broadcast gesendet. Die Geräteadressierung erfolgt über die MAC-Adresse der Netzwerkschnittstelle.

Siehe Script unter https://www.symcon.de/forum/threads/41614-WOL-per-Skript-funktioniert-auf-einmal-nicht-mehr?p=403834#post403834.

Anscheinend tritt das Berechtigungsproblem nur unter Linux auf.

Das liegt eher am fsockopen, gerade wenn auch andere Sockets etwas mit der Broadcast Adresse machen wollen.
Dafür gibt es die StreamContex Optionen wie im anderen Script.
Michael

Ich habe das Script unter Windows getestet -> WOL funktioniert.

Unter Linux (Tinkerboard S, Armbian Buster) kommt der Berechtigungsfehler.

Deshalb würde ich empfehlen, das alternative Script aus Post #3 zu verwenden.

Habs nicht getestet , aber funktioniert das auch unter Windows ?

Habe das Script mal nach Windows kopiert.
WOL mit dem alternativen Script funktioniert.

Allerdings gibt es unter Windows eine Warnung.

Warning:  socket_set_option(): unable to set socket option [10022]: Ein ungültiges Argument wurde angegeben.
in C:\IP-Symcon\scripts\19620.ips.php on line 29
102Magic Packet sent (102) to 192.168.178.255, MAC=XX:XX:XX:XX:XX:XX

Hier die betroffene Zeile:

$opt_ret = socket_set_option($s, 1, 6, TRUE);

Die Werte für die Option passen nicht, ich nutze immer diese Optionen für Broadcast:


socket_set_option($s, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($s, SOL_SOCKET, SO_REUSEADDR, 1);

Ist mit den Konstanten aus besser verständlich.
Michael

Mag sein, dass Port 15 nicht korrekt ist, es hat aber trotzdem funktioniert :confused:

Als IP Adresse sollte doch die Broadcast passen, die App auf dem Smartphone kennt ja auch nicht die richtige IP Adresse.
Bei Ausführen des Skriptes bekomme ich eine Laufzeit von 3ms angezeigt.

Mit der Option von Michael ist die Fehlermeldung unter Windows weg.

$opt_ret = socket_set_option($s, SOL_SOCKET, SO_BROADCAST, 1);

Ich habe die Änderung auch auf dem Tinkerboard übernommen.

Du musst aber beide eintragen.
Ansonsten kann es sein, dass wenn zeitgleich eine andere Anwendungen oder Script ebenfalls einen Broadcast senden will, es wieder fehlschlägt.
Michael

Erledigt und vielen Dank.

Wie sollte denn nun das Skript korrekt aussehen? Kenne mich mit php leider nicht aus☹

<?
$mac = „xxxxxxxxxxxx“; //MAC Adresse des einzuschaltenden Gerätes
$ip = „255.255.255.255“; // Broadcast adresse

wake($ip,$mac,15);//Port kann irgendwas sein

function wake($ip, $mac, $port)
{
$nic = fsockopen(„udp://“ . $ip, $port);
if($nic)
{
$packet = „“;
for($i = 0; $i < 6; $i++)
$packet .= chr(0xFF);
for($j = 0; $j < 16; $j++)
{
for($k = 0; $k < 6; $k++)
{
$str = substr($mac, $k * 2, 2);
$dec = hexdec($str);
$packet .= chr($dec);
}
}
$ret = fwrite($nic, $packet);
fclose($nic);
if($ret)
return true;
}
return false;
}

?>

Kann mit eventuell jemand ein funktionierendes Skript hier posten? Mein Skript funktioniert leider nicht mehr:/
Wäre super😉

Dies funktioniert bei mir. Sieht aber genauso aus wie bei dir.
Hast du mal mit Wireshark geschaut ob bei dir ueberhaupt ein UDP-Paket ankommt?

//******************************************************************************
// Wake on LAN
//******************************************************************************
function WakeOnLan($mac = "xxxxxxxxxxxx",$port = 9)
	{
	$debug = true;

	$ip = "192.168.1.255"; 		// Broadcast Adresse funktioniert
	$ip = "255.255.255.255"; 	// Broadcast Adresse funktioniert

  	$nic = fsockopen("udp://" . $ip, $port);
  	if($nic)
		{
    	$packet = "";
    	for($i = 0; $i < 6; $i++)
      		$packet .= chr(0xFF);
    	for($j = 0; $j < 16; $j++)
    		{
      		for($k = 0; $k < 6; $k++)
      			{
        		$str = substr($mac, $k * 2, 2);
        		$dec = hexdec($str);
        		$packet .= chr($dec);
      			}
    		}
   		$ret = fwrite($nic, $packet);
   		fclose($nic);

		if ( $debug ) IPSLogger_Dbg(basename(__FILE__),'WakeonLAN:'.$mac." Port: ". $port." Ret:".$ret );

		}

	}

Hier noch einmal das Script, welches bei mir unter Windows und Linux funktioniert:

<?php

// WakeOnLAN

$bcast = "192.168.178.255"; // broadcast address for the local subnet 192.168.178.0/24
$mac_addr = "XX:XX:XX:XX:XX:XX"; // MAC-address of network interface 

flush();

WakeOnLan($bcast,$mac_addr);


function WakeOnLan($addr, $mac)
{
$addr_byte = explode(':', $mac);
$hw_addr = '';

for ($a=0; $a < 6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));

$msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);

for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;

// send it to the broadcast address using UDP
// SQL_BROADCAST option isn't help!!
$s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($s == false)
{
echo "Error creating socket!
";
echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
}
else
{
// setting a broadcast option to socket:
$opt_ret = socket_set_option($s, SOL_SOCKET, SO_BROADCAST, 1);
//echo $opt_ret. "
";
if($opt_ret < 0)
{
echo "setsockopt() failed, error: " . strerror($opt_ret) . "
";
}

$opt_ret = socket_set_option($s, SOL_SOCKET, SO_REUSEADDR, 1);
//echo $opt_ret. "
";
if($opt_ret < 0)
{
echo "setsockopt() failed, error: " . strerror($opt_ret) . "
";
}

$e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
//echo $e. "
";
socket_close($s);
echo "Magic Packet sent (".$e.") to ".$addr.", MAC=".$mac;
}
}


?>

Die Broadcast-Adresse bitte an das eigene (Heim-)Netzwerk anpassen.

Besten Dank, werde es Donnerstag mal mit zwei PCs testen.

Ich verwende IPS im Docker meiner Syno. Bisher habe ich von den vielen Skripten nicht eines zum Laufen bekommen.
Mein kleiner NUC möchte nur zart per UDP geweckt werden und ist auch noch mit der Portnummer sehr anspruchsvoll.
Läuft also eher auf das Magic Packet hinaus.
Im Docker habe ich auch die Portfreigaben als UDP gemacht. Bringt aber nichts. Kann es sein, dass das im Docker gar nicht geht, weil nicht das ganze Betriebssysten zur Verfügung steht?

Ich kenne mich mich Docker nun nicht aus, aber das Problem wird eher sein, dass Du bei Docker ja Ports konfigurieren musst. In dem Fall brauchst Du ein UDP Broadcast, vielleicht hilft daher eine Google Suche zu UDP Broadcast Docker weiter das Problem zu beheben bzw. zu prüfen ob Du passende Einstellungen bei Dir vorgenommen hast.