ホームページ >バックエンド開発 >PHPチュートリアル >PHPを使用したネットワークブート
ローカルネットワークでは、マジックパケットをホストのネットワークカードに送信できます。マジックパケットの内容の先頭には6つの「FF」があり、その後にネットワークカードのMACが16個あります。ホストのバージョンが Wake on LAN 機能を有効にしている場合、ネットワーク カードは適格な Magic Packet を受信した後にコンピュータの電源を入れることができます。 (ホスト バージョンごとに、PME Event Wake Up、Power On By PCI Devices など、Wake on LAN の名前が異なります...)
ネットワーク ブートが可能かどうかに影響する別の設定。デバイス内での操作です。システム管理者は、ネットワーク カード デバイス コンテンツの電源管理で、「このデバイスによるコンピュータのウェイクアップを許可する」にチェックを入れる必要があります。
ネットワーク カードの MAC が 01-02-03-04-05-06 であると仮定します。
マジック パケットの内容は次のとおりです。
FFFFFFFFFFFF010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506
その後、UDP を使用しますプロトコル ポート 7 またはポート 9 がコンピュータに送信されます
したがって、ネットワーク ブートを実現する方法は、デバイス (サーバー) がローカル ネットワーク内のターゲット コンピュータのネットワーク カードにマジック パケットを送信する方法を見つけることです。 Magic Packet の送信に使用され、通常は外部接続があり、外部ネットワークから起動する効果も得られます。
次の PHP 送信マジック パケットのサンプル ソース
WOL: Wake-on-LAN チュートリアルとボーナス PHP スクリプト
次のようにわずかに変更されています:
class WakeOnLan { /** * 喚醒電腦 * @param type $addr ,目標IP 或 廣播位址(格式 01-02-03-04-05-06 或 01:02:03:04:05:06) * @param type $mac * @param type $port , 7 or 9 * @return boolean */ public function wake($addr, $mac, $port) { $mac = str_replace("-", ":", $mac); $addr_byte = explode(':', $mac); $hw_addr = ''; for ($a = 0; $a < 6; $a++) { $hw_addr .= chr(hexdec($addr_byte[$a])); } // 開頭六個 "FF" $msg = chr(255) . chr(255) . chr(255) . chr(255) . chr(255) . chr(255); // 16個MAC for ($a = 1; $a <= 16; $a++) { $msg .= $hw_addr; } // 開一個 UDP 的 socket // AF_INET:IP4 // SOCK_DGRAM:The UDP protocol is based on this socket type // SOL_UDP:使用 UDP 通訊協定 $skt = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $err = array(); if ($skt === false) { $err[] = "Error creating socket!"; $err[] = "Error code is '" . socket_last_error($skt) . "' - " . socket_strerror(socket_last_error($skt)); throw new Exception(implode("\n", $err)); } else { // 設定使用broadcast廣播訊息 // $opt_ret = socket_set_option($skt, 1, 6, TRUE); $opt_ret = socket_set_option($skt, SOL_SOCKET, SO_BROADCAST, true); if ($opt_ret === false) { $err[] = "setsockopt() failed, error: " . socket_strerror(socket_last_error($skt)); throw new Exception(implode("\n", $err)); } if (socket_sendto($skt, $msg, strlen($msg), 0, $addr, $port)) { //Magic Packet sent successfully $res = trim(socket_strerror(socket_last_error($skt))); socket_close($skt); return $res; } else { $err[] = "Magic packet failed!"; throw new Exception(implode("\n", $err)); } } }}$WOL = new WakeOnLan();try { $res = $WOL->wake('192.168.0.255', "01-02-03-04-05-06", 7); $res = $WOL->wake('192.168.0.255', "01-02-03-04-05-06", 9); var_dump($res);} catch (Exception $ex) { var_dump($ex->getMessage());}
$a = get_defined_constants(TRUE);foreach ($a['sockets'] as $constant => $value) { printf("%-25s %d", $constant, $value);}
Wake on LAN - フリー百科事典 Wikipedia
Windows 8 Wake On LAN のセットアップ - ダーク スレッド
PHP:socket_create - マニュアル
PHP:socket_set_option - マニュアル
PHP:socket_get_option - マニュアル
arduino - PHP : UDP ブロードキャスト メッセージを送信し、応答を待ちます - スタック オーバーフロー
小新竹の元の部族: [TCP/IP 図解] ブロードキャストとマルチキャスト