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

用Go實現底層Socket的Wake-on-LAN技術

網絡 網絡管理
Wake-on-LAN,簡稱WOL或WoL,中譯為“網絡喚醒”、“遠程喚醒”,是一種遠程喚醒技術及標準,功效在于讓休眠狀態或關機狀態的電腦,透過局域網的另一臺電腦對其發令,使其喚醒、恢復成運作狀態,或從關機狀態轉成開機狀態。

在日常工作或運維自動化中,我們可能會遇到這樣的場景:

  • 想遠程喚醒家里的 NAS 或服務器;
  • 企業中控平臺需要遠程喚醒局域網中的某些設備;
  • 想做一個能自動喚醒局域網機器的程序或服務。

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

什么是WOL?

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

Wake-on-LAN,簡稱WOL或WoL,中譯為“網絡喚醒”、“遠程喚醒”,是一種遠程喚醒技術及標準,功效在于讓休眠狀態或關機狀態的電腦,透過局域網的另一臺電腦對其發令,使其喚醒、恢復成運作狀態,或從關機狀態轉成開機狀態。該消息通常由在連接到同一局域網的設備上執行的程序發送到目標計算機。也可以使用子網定向廣播或 WoL 網關服務從另一個網絡發起消息。

WOL原理

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

電腦處在關機(或休眠)狀態時,機內的網卡及主板部分仍保有微弱的供電,此微弱供電能讓網卡保有最低的運作能力,使網卡能聆聽來自電腦外部的網絡廣播信息,并對信息內容進行偵測與解讀,一旦發現網絡廣播的內容中有特定的“魔法數據包”(Magic Packet),就會對該數據包的內容進行研判。

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

什么是魔法數據包?

魔法數據包當然是會變魔法的數據包啦,以下還是一段摘自wiki百科的描述

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

具體如下:魔法數據包(Magic Packet)是一個廣播性的幀(frame),透過端口7或9發送,可以使用無需建立連接(Connectionless protocol)的通信協議(如UDP、IPX)來傳遞,目前鑒于已很少采用Novell NetWare網絡操作系統的IPX協議而多選用UDP。

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

用Golang編寫底層WOL代碼

我們下面用Go原生的syscall庫構建底層UDP Socket,通過廣播方式發送WOL數據包。

第一步:構造會魔法的數據包(Magic Packet啊,他好會呀??)

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")
	}
// 解碼為字節
	macBytes, err := hex.DecodeString(macClean)
if err != nil {
return nil, fmt.Errorf("failed to parse MAC address: %v", err)
	}


// 創建 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地址轉成字節數組;
  • 然后拼接6字節廣播頭 + 16次重復MAC。

第二步:使用底層UDP Socket廣播發送

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)
	}


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


// 發送數據包
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創建UDP Socket;
  • 配置為廣播模式;
  • 使用Sendto向255.255.255.255:9廣播發送數據包。

第三步:編寫入口主函數

func main() {
	mac := "00:11:22:33:44:55"          // 目標設備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)
	}
}

以上代碼我們就編寫好了,那么下面就是見證時刻的奇跡了,好激動啊,運行命令如下所示:

go run main.go

毫不意外程序運行是失敗的,因為我那臺祖傳的windows筆記本睡死了。有句話說得好,古人云,愛而不得的人,我們怎么叫都叫不醒,就如這臺電腦,猶如我那顆死透了的心??,從此水泥封心。

使用注意事項

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

總結

使用底層Socket方式構造并發送Wake-on-LAN包,在Go中非常適合構建系統級喚醒工具。相比起高層封裝方式,這種原生實現方式更靈活、更可控,也更適合你構建跨平臺或嵌入式場景的WOL工具。

參考鏈接??:https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E5%96%9A%E9%86%92

責任編輯:武曉燕 來源: 馬嘍編程筆記
相關推薦

2025-05-16 10:05:00

WOLGoSocket

2024-09-11 09:00:45

.NETWOL技術

2024-04-24 09:28:29

LAN技術

2021-06-21 11:25:54

GoTLS語言

2010-10-14 11:37:24

無線LAN技術

2017-08-31 11:28:47

Slice底層實現

2021-11-02 12:19:18

Go函數結構

2010-09-15 12:56:31

無線LAN技術

2010-03-15 16:50:48

無線LAN技術

2010-01-08 10:54:22

LAN多層交換技術

2009-12-30 15:24:58

無線LAN技術

2021-10-26 13:18:52

Go底層函數

2024-10-14 08:51:52

協程Go語言

2011-09-19 16:12:01

LAN交換機局域網

2014-07-22 10:29:04

背包算法coffee

2021-12-09 10:45:19

分布式事務框架

2011-09-06 09:48:41

MTK平臺

2012-03-13 10:40:58

Google Go

2021-01-21 05:45:07

Go字數統計

2009-07-03 09:44:39

實現RSS功能JSP技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日操夜操 | 成人免费一区二区三区视频网站 | 欧美1级| 日本精品视频 | 免费一级大片 | 亚洲国产网 | 国产成人久久精品 | 亚洲 中文 欧美 日韩 在线观看 | 欧美成人a∨高清免费观看 欧美日韩中 | 欧美a在线 | 久草青青草 | 久久国产精品精品国产色婷婷 | 韩国成人在线视频 | av网站免费 | 黄网站免费在线观看 | 欧美国产精品一区二区三区 | 中文字幕一区二区三区在线乱码 | 久久精品国产亚洲 | 91久久精品一区二区二区 | 亚洲第1页 | 91精品国产91综合久久蜜臀 | wwww.8888久久爱站网 | 久久久精品久久 | 一级片在线视频 | 日韩一区二区三区四区五区六区 | 久久精品—区二区三区 | 91久久综合亚洲鲁鲁五月天 | 欧美精品1区 | 日日夜夜天天 | 亚洲成人综合社区 | 九九伦理电影 | 国产免费色 | 色噜噜亚洲男人的天堂 | 久久久久久国产一区二区三区 | 91精品久久久 | 夜夜爽99久久国产综合精品女不卡 | 国产精品成人一区二区 | 国内自拍视频在线观看 | 国产精品一区2区 | 国产一区999 | 国产91丝袜在线18 |