ホームページ >バックエンド開発 >PHPチュートリアル >PHPを使用したネットワークブート

PHPを使用したネットワークブート

WBOY
WBOYオリジナル
2016-06-20 12:39:461504ブラウズ

ローカルネットワークでは、マジックパケットをホストのネットワークカードに送信できます。マジックパケットの内容の先頭には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());}
  • 指定されたマジック パケットをブロードキャスト アドレス (例: 192.168.0.255) に渡します。これは、ローカル ネットワーク内のすべてのコンピューターに送信でき、一致する MAC を持つコンピューターのみが起動します。
  • 一部のコンピューターでは、起動するためにポート 7 またはポート 9 に渡す必要がある場合があります。
  • 元の例のsocket_set_option($skt, 1, 6, TRUE)では、SOL_SOCKETとSO_BROADCASTの定数が環境によって異なると思われるため、1と6は定数に置き換えられています。すべてのソケット定数を表示 http://php.net/manual/en/sockets.constants.php#108291
    $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 図解] ブロードキャストとマルチキャスト
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。