使用 PHP 網路開機

php中文网
发布: 2016-06-20 12:39:46
原创
1725人浏览过

在區域網路中,可以傳送 magic packet 給主機的網路卡,magic packet 內容開頭有6個 "ff",再接 16 個網路卡 mac,當主機版有開啟支援 wake on lan 功能,網路卡接收到符合條件的 magic packet,就能開啟電腦。(每個主機版關於 wake on lan 的名稱不盡相同,例如 pme event wake up、power on by pci devices...)

另一個影響能否網路開機的設定,在作業系統裡面裝置管理員,網卡裝置內容裡的電源管理,需勾選「允許這個裝置喚醒電腦」。

假設網路卡 MAC 為:01-02-03-04-05-06

Magic Packet 內容則為:

FFFFFFFFFFFF010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506010203040506
登录后复制

然後以 UDP 通訊協定傳送給電腦的 port 7、或 port 9

立即学习PHP免费学习笔记(深入)”;

所以實現網路開機的方式,就是在區網內想辦法傳送給目標電腦網卡 Magic Packet,如果用來傳送 Magic Packet 的設備(Server),平常也有對外連線,也可達成在外網開機的效果。

以下 PHP 傳送 Magic Packet 範例來源

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店

WOL: Wake-on-LAN Tutorial with Bonus PHP Script

僅稍微修改後如下:

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());}
登录后复制
  • 將 Magic Packet 指定傳給 broadcast address(例如:192.168.0.255),可傳送給區網所有電腦,MAC符合的才會開機。
  • 有的電腦可能傳給 port 7 或 port 9 其中一個才會開機。
  • 原範例 socket_set_option($skt, 1, 6, TRUE),1、6 改成用常數取代,因不同環境 SOL_SOCKET、SO_BROADCAST 的常數直似乎不同。查看所有 soket 常數 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);}
    登录后复制

網路喚醒 - 維基百科,自由的百科全書

設定Windows 8網路喚醒(Wake On LAN) - 黑暗執行緒

PHP: socket_create - Manual

PHP: socket_set_option - Manual

PHP: socket_get_option - Manual

arduino - PHP : Send an UDP broadcast message , and wait the response - Stack Overflow

小信豬的原始部落: [TCP/IP Illustrated] Broadcasting & Multicasting
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号