成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 Go 實(shí)現(xiàn)底層 Socket 的 Wake-on-LAN 技術(shù)

開發(fā) 后端
Wake-on-LAN 是一種遠(yuǎn)程喚醒技術(shù)及標(biāo)準(zhǔn),功效在于讓休眠狀態(tài)或關(guān)機(jī)狀態(tài)的電腦,透過局域網(wǎng)的另一臺(tái)電腦對(duì)其發(fā)令,使其喚醒、恢復(fù)成運(yùn)作狀態(tài),或從關(guān)機(jī)狀態(tài)轉(zhuǎn)成開機(jī)狀態(tài)。

在日常工作或運(yùn)維自動(dòng)化中,我們可能會(huì)遇到這樣的場景:

  • 想遠(yuǎn)程喚醒家里的 NAS 或服務(wù)器;
  • 企業(yè)中控平臺(tái)需要遠(yuǎn)程喚醒局域網(wǎng)中的某些設(shè)備;
  • 想做一個(gè)能自動(dòng)喚醒局域網(wǎng)機(jī)器的程序或服務(wù)。

這時(shí),Wake-on-LAN(WOL)就是你的好朋友。今天我們就用Go語言手把手實(shí)現(xiàn)一個(gè)簡陋的WOL喚醒工具!

1. 什么是WOL?

什么是wol呢?下面是一段摘自wiki百科的簡單介紹,具體介紹如下所述:

Wake-on-LAN,簡稱WOL或WoL,中譯為“網(wǎng)絡(luò)喚醒”、“遠(yuǎn)程喚醒”,是一種遠(yuǎn)程喚醒技術(shù)及標(biāo)準(zhǔn),功效在于讓休眠狀態(tài)或關(guān)機(jī)狀態(tài)的電腦,透過局域網(wǎng)的另一臺(tái)電腦對(duì)其發(fā)令,使其喚醒、恢復(fù)成運(yùn)作狀態(tài),或從關(guān)機(jī)狀態(tài)轉(zhuǎn)成開機(jī)狀態(tài)。該消息通常由在連接到同一局域網(wǎng)的設(shè)備上執(zhí)行的程序發(fā)送到目標(biāo)計(jì)算機(jī)。也可以使用子網(wǎng)定向廣播或 WoL 網(wǎng)關(guān)服務(wù)從另一個(gè)網(wǎng)絡(luò)發(fā)起消息。

2. WOL原理

這也是一段摘自wiki百科的一段描述,一般而言,WOL技術(shù)的遠(yuǎn)程喚醒步驟如下:

電腦處在關(guān)機(jī)(或休眠)狀態(tài)時(shí),機(jī)內(nèi)的網(wǎng)卡及主板部分仍保有微弱的供電,此微弱供電能讓網(wǎng)卡保有最低的運(yùn)作能力,使網(wǎng)卡能聆聽來自電腦外部的網(wǎng)絡(luò)廣播信息,并對(duì)信息內(nèi)容進(jìn)行偵測與解讀,一旦發(fā)現(xiàn)網(wǎng)絡(luò)廣播的內(nèi)容中有特定的“魔法數(shù)據(jù)包”(Magic Packet),就會(huì)對(duì)該數(shù)據(jù)包的內(nèi)容進(jìn)行研判。

魔法數(shù)據(jù)包是以廣播方式發(fā)送的,廣播的方式與范疇可以是整個(gè)局域網(wǎng)(LAN),也可以是特定的子網(wǎng)(Subnet),同時(shí)魔法數(shù)據(jù)包內(nèi)會(huì)有某部(或一群)電腦的網(wǎng)絡(luò)地址數(shù)據(jù),網(wǎng)卡一旦解讀研判出所指的地址是自身所處的電腦時(shí),網(wǎng)卡就會(huì)通知機(jī)內(nèi)的主板、電源供應(yīng)器,開始進(jìn)行開機(jī)(或喚醒)的程序。

3. 什么是魔法數(shù)據(jù)包?

魔法數(shù)據(jù)包當(dāng)然是會(huì)變魔法的數(shù)據(jù)包啦,以下還是一段摘自wiki百科的描述具體如下:

魔法數(shù)據(jù)包(Magic Packet)是一個(gè)廣播性的幀(frame),透過端口7或9發(fā)送,可以使用無需建立連接(Connectionless protocol)的通信協(xié)議(如UDP、IPX)來傳遞,目前鑒于已很少采用Novell NetWare網(wǎng)絡(luò)操作系統(tǒng)的IPX協(xié)議而多選用UDP。

在魔法數(shù)據(jù)包內(nèi),每次都會(huì)先有連續(xù)6個(gè)"FF"(十六進(jìn)制,換算成二進(jìn)制即:11111111)的數(shù)據(jù),即:FF FF FF FF FF FF,在連續(xù)6個(gè)"FF"后則開始帶出MAC地址信息,有時(shí)還會(huì)帶出4字節(jié)或6字節(jié)的密碼,一旦經(jīng)由網(wǎng)卡偵測、解讀、研判(廣播)魔法數(shù)據(jù)包的內(nèi)容,內(nèi)容中的MAC地址、密碼若與電腦自身的地址、密碼吻合,就會(huì)啟動(dòng)喚醒、開機(jī)的程序。

4. 用Golang編寫底層WOL代碼

我們下面用Go原生的syscall庫構(gòu)建底層UDP Socket,通過廣播方式發(fā)送WOL數(shù)據(jù)包。

第一步:構(gòu)造會(huì)魔法的數(shù)據(jù)包(Magic Packet啊,他好會(huì)呀??)

func createMagicPacket(mac string) ([]byte, error) {
// 清理 MAC 格式
	macClean := strings.ReplaceAll(strings.ReplaceAll(mac, ":", ""), "-", "")
if len(macClean) != 12 {
return nil, fmt.Errorf("invalid MAC address format")
	}
// 解碼為字節(jié)
	macBytes, err := hex.DecodeString(macClean)
if err != nil {
return nil, fmt.Errorf("failed to parse MAC address: %v", err)
	}


// 創(chuàng)建 Magic Packet
	packet := make([]byte, 6+(16*6))
for i := 0; i < 6; i++ {
		packet[i] = 0xFF
	}
for i := 0; i < 16; i++ {
copy(packet[6+i*6:], macBytes)
	}
return packet, nil
}

解析:

  • 這里我們先將MAC地址轉(zhuǎn)成字節(jié)數(shù)組;
  • 然后拼接6字節(jié)廣播頭 + 16次重復(fù)MAC。

第二步:使用底層UDP Socket廣播發(fā)送

func sendMagicPacket(packet []byte, broadcastIP string, port int) error {
	fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
if err != nil {
return fmt.Errorf("failed to create socket: %v", err)
	}
defer syscall.Close(fd)


// 啟用廣播
if err := syscall.SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1); err != nil {
return fmt.Errorf("failed to set broadcast option: %v", err)
	}


// 設(shè)置目標(biāo)地址
	dst := syscall.SockaddrInet4{Port: port}
	ip := net.ParseIP(broadcastIP).To4()
if ip == nil {
return fmt.Errorf("invalid broadcast IP address")
	}
copy(dst.Addr[:], ip)


// 發(fā)送數(shù)據(jù)包
if err := syscall.Sendto(fd, packet, 0, &dst); err != nil {
return fmt.Errorf("failed to send magic packet: %v", err)
	}
	fmt.Println("Magic Packet sent via raw socket successfully!")
return nil
}

解析:

  • 使用syscall.Socket創(chuàng)建UDP Socket;
  • 配置為廣播模式;
  • 使用Sendto向255.255.255.255:9廣播發(fā)送數(shù)據(jù)包。

第三步:編寫入口主函數(shù)

func main() {
	mac := "00:11:22:33:44:55"          // 目標(biāo)設(shè)備MAC地址
	broadcastIP := "255.255.255.255"    // 廣播地址
	port := 9                           // 常見UDP端口


	packet, err := createMagicPacket(mac)
if err != nil {
		fmt.Printf("Packet creation error: %v\n", err)
return
	}


if err := sendMagicPacket(packet, broadcastIP, port); err != nil {
		fmt.Printf("Failed to send packet: %v\n", err)
	}
}

以上代碼我們就編寫好了,那么下面就是見證時(shí)刻的奇跡了,好激動(dòng)啊,運(yùn)行命令如下所示:

go run main.go

毫不意外程序運(yùn)行是失敗的,因?yàn)槲夷桥_(tái)祖?zhèn)鞯膚indows筆記本睡死了。有句話說得好,古人云,愛而不得的人,我們?cè)趺唇卸冀胁恍眩腿邕@臺(tái)電腦,猶如我那顆死透了的心??,從此水泥封心。

5. 使用注意事項(xiàng)

  • 開啟 BIOS 中的 WOL 支持,網(wǎng)卡也要支持
  • 關(guān)機(jī)狀態(tài)需有待機(jī)電源(即插著電的關(guān)機(jī))
  • 如果用 Linux,可以通過 ethtool 啟用網(wǎng)卡 WOL 功能:
sudo ethtool -s eth0 wol g
  • 若在公網(wǎng)喚醒設(shè)備,需路由器設(shè)置端口轉(zhuǎn)發(fā)或VPN內(nèi)網(wǎng)

6. 總結(jié)

使用底層Socket方式構(gòu)造并發(fā)送Wake-on-LAN包,在Go中非常適合構(gòu)建系統(tǒng)級(jí)喚醒工具。相比起高層封裝方式,這種原生實(shí)現(xiàn)方式更靈活、更可控,也更適合你構(gòu)建跨平臺(tái)或嵌入式場景的WOL工具。

責(zé)任編輯:趙寧寧 來源: 馬嘍編程筆記
相關(guān)推薦

2025-06-12 02:21:00

2024-09-11 09:00:45

.NETWOL技術(shù)

2024-04-24 09:28:29

LAN技術(shù)

2021-06-21 11:25:54

GoTLS語言

2010-10-14 11:37:24

無線LAN技術(shù)

2021-11-02 12:19:18

Go函數(shù)結(jié)構(gòu)

2017-08-31 11:28:47

Slice底層實(shí)現(xiàn)

2010-09-15 12:56:31

無線LAN技術(shù)

2010-03-15 16:50:48

無線LAN技術(shù)

2010-01-08 10:54:22

LAN多層交換技術(shù)

2009-12-30 15:24:58

無線LAN技術(shù)

2021-10-26 13:18:52

Go底層函數(shù)

2024-10-14 08:51:52

協(xié)程Go語言

2011-09-19 16:12:01

LAN交換機(jī)局域網(wǎng)

2014-07-22 10:29:04

背包算法coffee

2021-12-09 10:45:19

分布式事務(wù)框架

2011-09-06 09:48:41

MTK平臺(tái)

2012-03-13 10:40:58

Google Go

2021-01-21 05:45:07

Go字?jǐn)?shù)統(tǒng)計(jì)

2009-07-03 09:44:39

實(shí)現(xiàn)RSS功能JSP技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本在线视频不卡 | 欧美日韩午夜精品 | 亚洲综合婷婷 | 天天视频一区二区三区 | 中国美女撒尿txxxxx视频 | 精品国产乱码 | 国产日韩欧美在线观看 | 91免费福利在线 | 日韩欧美一区二区三区四区 | 欧美一级免费 | 久久国产精品视频 | 中文字幕亚洲精品在线观看 | 欧美精品久久久久久 | 国产欧美一区二区三区在线看 | 欧美在线一区二区三区 | 亚洲精品国产成人 | 好婷婷网| 激情视频中文字幕 | 日韩一二区 | 国产精品一区二区三区在线播放 | 色必久久 | 日韩资源 | 欧美在线一区二区三区 | 国产一区二区三区在线 | www精品美女久久久tv | 人妖一区 | 亚洲一区二区在线电影 | 欧美在线观看一区 | 久久久www成人免费精品 | 国产精品一区二区欧美 | 亚洲精品日韩精品 | 国产精品久久久久久久久动漫 | 成人黄色av网址 | 成年人在线观看 | 麻豆精品国产免费 | 欧美日韩国产在线观看 | 亚洲啊v在线 | 久久国产精品久久国产精品 | 二区在线视频 | 国产二区在线播放 | 本地毛片 |