我为wakeOnLan(WOL)开发了一个应用程序,并且在同一系列IP地址中运行良好。
我的问题是我无法唤醒系统在同一网络上其他系列IP地址上的系统。
对于EX:
我的系统A 拥有IP 172.16.46.76,
我可以使用Ip地址172.16.46.13唤醒任何系统C ,并且还可以使用BroadCast地址1721.16在LAN上唤醒任何系统,范围为172.16.46.1到172.16.45.254 .46.255
但是当我从具有IP 172.16.51.26的其他系统B 运行相同的应用程序时,我无法使用IP地址172.16.46.13唤醒所有系统C
我使用WakeOnLan监视器检查确认系统C 是否正在接收魔术包。它从系统A 接收,但不从系统B 接收。我能够从系统A 和系统B
ping系统C任何人都可以建议我解决我做错的地方。我在下面给出了代码供您参考。
import sys, struct, socket
# Configuration variables
broadcast = ['172.16.46.255','172.16.51.255']
wol_port = 9
known_computers = {
'mercury' : '00:1C:55:35:12:BF',
'venus' : '00:1d:39:55:5c:df',
'earth' : '00:10:60:15:97:fb',
}
def WakeOnLan(ethernet_address):
# Construct 6 byte hardware address
add_oct = ethernet_address.split(':')
if len(add_oct) != 6:
print "\n*** Illegal MAC address\n"
print "MAC should be written as 00:11:22:33:44:55\n"
return
hwa = struct.pack('BBBBBB', int(add_oct[0],16),
int(add_oct[1],16),
int(add_oct[2],16),
int(add_oct[3],16),
int(add_oct[4],16),
int(add_oct[5],16))
# Build magic packet
msg = '\xff' * 6 + hwa * 16
# Send packet to broadcast address using UDP port 9
print msg
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
soc.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
for i in broadcast:
soc.sendto(msg,(i,wol_port))
soc.close()
def wol(*argv):
if len(argv) == 0:
print "\n*** No computer given to power up\n"
print "Use: 'wol (computername)' or 'wol (00:11:22:33:44:55)'"
else:
for i in argv:
if i[0] != '/':
if ":" in i:
# Wake up using MAC address
print 'waking using MAC %s' % i
WakeOnLan(i)
else:
# Wake up known computers
if i in known_computers:
WakeOnLan(known_computers[i])
else:
print "\n*** Unknown computer " + i + "\n"
quit()
if len(argv) == 1:
print "\nDone! The computer should be up and running in a short while."
else:
print "\nDone! The computers should be up and running in a short while."
print
wol('xx:xx:xx:xx:xx:xx')
来自Wake On Lan Monitor的快照。
答案 0 :(得分:0)
你可以检查两件事。
您正尝试将广播数据包从一个子网发送到另一个子网。这意味着两者之间的网络设备,可能是路由器。路由器通常配置为禁止其托管子网之间的广播数据包,以避免broadcast storm。
如果这是您拥有路由器的自己的实验网络,那么您将能够自己进入并更改路由器配置。
如果你已经完成了(1)并且它仍然无效,那么请查看你正在生成的数据包的TTL。如果它们被发送的TTL为1(出于安全原因通常是广播/多播的默认值)那么你需要为每个必须遍历的网络设备增加1,因为每个设备都会减少TTL如果达到零则丢弃数据包。