网络唤醒 _WOL($Mac,$port=7)的UDF函数,附原理

转载本站文章请注明,转载自:昕星谷[http://oneyicn.gobaiyi.com]
本文链接: 网络唤醒 _WOL($Mac,$port=7)的UDF函数,附原理">http://oneyicn.gobaiyi.com/archives/2041/

看了其他的网络唤醒代码,总是不是正常唤醒主机。用别的工具(非autoit)就可以,看来还是代码算法问题了。后来看了下网络唤醒原理,附近文章尾,原来只要广播一段字节就可以了。那就好办了,先生成一段规则的字节,出广播一下就可以了。比用转成ASCII码的好些,不知为什么转成ASCII码的,会有丢失字节的情况,这里用的是直接用Binary字节变量。
真正的au3 网络唤醒 _WOL下载download真正的au3 网络唤醒 _WOL(累计下载 117 次, 大小2.08 kB)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_outfile=
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Comment=网络唤醒 _WOL($Mac,$port=7) 数组形式传递MAC,可以一次唤醒多机 直接唤醒一台机的MAC MAC格式支持:跟-分隔符的,或是不带分隔符的http://oneyicn.gobaiyi.com/archives/2041/
#AutoIt3Wrapper_Res_Description=http://oneyicn.gobaiyi.com/archives/2041/
#AutoIt3Wrapper_Res_Fileversion=0.0.0.1
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
#AutoIt3Wrapper_Res_LegalCopyright=昕星所有,转载请注量出处http://oneyicn.gobaiyi.com/archives/2041/
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#Region AutoIt3Wrapper 预编译参数(常用参数)
;#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer% ;自定义资源段
;#AutoIt3Wrapper_Run_Tidy= ;脚本整理
;#AutoIt3Wrapper_Run_Obfuscator= ;代码迷惑
;#AutoIt3Wrapper_Run_AU3Check= ;语法检查
;#AutoIt3Wrapper_Run_Before= ;运行前
;#AutoIt3Wrapper_Run_After= ;运行后
#EndRegion AutoIt3Wrapper 预编译参数设置完成
#cs ____________________________________
 
Au3 版本: 3.3.6.1
脚本作者: 昕星
Email:
QQ/TM:
脚本版本:
脚本功能: 网络唤醒
; 网络唤醒
;功能说明 数组形式传递MAC,可以一次唤醒多机 直接唤醒一台机的MAC
; MAC格式支持:跟-分隔符的,或是不带分隔符的
;参数 $mac MAC格式的字符串或是数组都可以,程序自动识别 $port,程序运行端口,
;错误返回 0为网络错误
; -1参数不对
; -2MAC格式不对
#ce _______________脚本开始_________________
 
#include-once
;~ 数组形式传递MAC,可以一次唤醒多机
;Dim $MACAddress[3]=["40-61-86-5E-F8-47","40:61:86:5e:f7:c1","4061865eF887"]
;直接唤醒一台机的MAC
;~ Dim $MACAddress="4061-86-5E-F8-47"
 
;_WOL($MACAddress)
 
; ===================================================================
; 函数 *=== 此功能返回生成 "数据包" ===*
; ===================================================================
Func GenerateMagicPacket($strMACAddress)
;~ ConsoleWrite(StringMid($strMACAddress, 1, 2) & @CRLF)
$MagicPacket = Binary("0xFFFFFFFFFFFF")
For $p = 1 To 16 ;
$MagicPacket &= $strMACAddress
Next
$MagicPacket &= ("000000000000");最后6个字节是密码,没有密码的话可以0x00填充
ConsoleWrite($MagicPacket & @CRLF)
Return $MagicPacket
EndFunc
 
; ===================================================================
; 网络唤醒
;功能说明 数组形式传递MAC,可以一次唤醒多机 直接唤醒一台机的MAC
; MAC格式支持:跟-分隔符的,或是不带分隔符的
;参数 $mac MAC格式的字符串或是数组都可以,程序自动识别 $port,程序运行端口,
;错误返回 0为网络错误
; -1参数不对
; -2MAC格式不对
; ===================================================================
Func _WOL($Mac,$port=7)
$IPAddress = "255.255.255.255"; 这是广播地址 !
UDPStartUp();开始 UDP 服务.
$connexion = UDPOpen($IPAddress,$port,1);连接到服务器进行会话,port为7赋给变量"$connexion"
If $connexion[0]==0 Then Return;如果出错则返回 @error: windows API WSAGetError 返回值
 
If IsArray($Mac) Then
ConsoleWrite("参数为数组" & @CRLF)
$dims = UBound($Mac, 0)
If $dims > 1 Then Return -1 ;参数不对
 
FOR $element IN $Mac
ConsoleWrite($element & @CRLF)
$element = StringReplace($element, ":", "")
$element = StringReplace($element, "-", "")
$strLen=StringLen ($element)
If StringIsXDigit($element) And $strLen < 13 Then
$res = UDPSend($connexion, GenerateMagicPacket($element)) ;打开的套接字(socket)上面发送数据,GenerateMagicPacket($MACAddress)调用函数
Else
ConsoleWrite("MAC格式不对" & @CRLF)
Return -2;MAC格式不对
EndIf
NEXT
Else
$Mac = StringReplace($Mac, ":", "")
$Mac = StringReplace($Mac, "-", "")
$strLen=StringLen ($Mac)
ConsoleWrite($Mac & @CRLF)
If StringIsXDigit($Mac) And $strLen < 13 Then
$res = UDPSend($connexion, GenerateMagicPacket($Mac)) ;打开的套接字(socket)上面发送数据,GenerateMagicPacket($MACAddress)调用函数
Else
ConsoleWrite("MAC格式不对" & @CRLF)
Return -2;MAC格式不对
EndIf
EndIf
 
EndFunc
#cs 网络唤醒的原理
在关机状态下,如果网卡收到一连串的特殊的脉冲,就会点亮电源。对于每个网卡来说,脉冲是不一样的。
发送网络数据包的时候,网卡就会在发出一系列的脉冲到网线上。因此,特殊的脉冲就是特殊的数据包。这个
数据包长度是108 Bytes,其中前6个字节 是0xFF填充后面96个字节是用要唤醒网卡对应的MAC地址填充,
96=16x6 就是说 MAC地址重复16次最后6个字节是密码,没有密码的话可以0x00填充就像这个样子,注意是字节
 
ff ff ff ff ff ff//前面6个ff
00 16 e6 93 23 45//16次要唤醒网卡的MAC地址
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 16 e6 93 23 45
00 00 d0 0d 6f 00//密码
并且这个特殊的数据包可以封装在任何协议之上,802.3协议,ip 协议,tcp协议,udp协议,ipx等等
也就是说不管怎么着,网络中只要出现了 这个数据包对应的脉冲就会唤醒主机。
有一个问题 就是 如果 LAN 中使用了交换机,那么这个数据包就有可能不会发送给那个主机,那么也就不会收的脉冲,解决的办法就是使用广播。
#CE

随机文章推荐

2010年6月28日 | 归档于 脚本
标签: , , , ,
本文目前尚无任何评论.

发表评论

XHTML: 您可以使用这些标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

无觅相关文章插件,快速提升流量