首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在其他系列IP上唤醒局域网

在其他系列IP上唤醒局域网
EN

Stack Overflow用户
提问于 2015-03-03 05:05:29
回答 1查看 1.1K关注 0票数 0

我为wakeOnLan (WOL)开发了一个应用程序,并且在相同的IP地址系列中很好地工作。

我的问题是我不能wakeOnLan系统在同一网络上的其他系列IP地址上的系统。

前任:

我的系统A有IP 172.16.46.76,

我能够用Ip地址172.16.46.13唤醒任何系统C,也能够在局域网上使用BroadCast地址1721.16.46.255在172.16.46.1至172.16.45.254的范围内唤醒任何系统。

但是,当我从具有IP 172.16.51.26的其他系统B运行相同的应用程序时,我无法使用IP地址172.16.46.13的wakeOnLan system C

我使用WakeOnLan监视器检查了system 是否正在接收神奇的数据包。它是从系统A接收的,而不是从系统B接收的。我可以用系统Asystem B来平系统C

有人能建议我解决哪里做错了吗?下面是我的代码,供您参考。

代码语言:javascript
复制
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')

从Lan监视器上唤醒的快照。

EN

回答 1

Stack Overflow用户

发布于 2015-03-03 14:29:28

有两件事你可以检查。

  1. 你试图从一个子网向另一个子网发送一个广播包。这意味着在两者之间存在一个网络设备,可能是路由器。路由器通常被配置为不允许其托管子网之间的广播数据包,以避免广播风暴。 如果这是您自己的实验网络,您拥有路由器,那么您将能够进入和改变路由器配置自己。
  2. 如果您已经完成了(1)并且它仍然不工作,那么查看您正在生成的数据包的TTL。如果发送的TTL为一个TTL (出于安全原因通常是广播/多播的缺省值),那么您需要为每个网络设备增加一个TTL,因为每个设备都会减少TTL并在达到零的情况下丢弃数据包。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28824492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档