2015-03-03 3 views
0

Я разработал приложение для wakeOnLan (WOL) и отлично работает в той же серии IP-адресов.Wake On Lan В других сериях IP

Моя проблема: я не могу wakeOnLan, где системы находятся на другой серии IP-адресов в одной сети.

Для EX:

Моей системы А оказывает IP 172.16.46.76,

Я могу разбудить любой системы C с IP-адресом 172.16.46.13, а также в состоянии разбудить на LAN любой системы с в диапазоне от 172.16.46.1 до 172.16.45.254, используя широковещательный адрес 1721.16.46.255

Но когда я запускаю того же приложение из других системы B имея IP 172.16.51.26, я не в состоянии в keOnLan системы C с IP-адресом 172.16.46.13

Я проверил с помощью WakeOnLAN монитора, чтобы подтвердить, если система C получает волшебный пакет. И он принимает от системы A, но не от системы B. Я мог бы в состоянии системы пинга-C с обоего системы А и системы B

Может ли один предложить мне решение, где я делаю неправильно. Код я даю ниже для вашей справки.

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. enter image description here

ответ

0

Две вещи, которые вы можете проверить.

  1. Вы пытаетесь отправить широковещательный пакет из одной подсети в другую. Это подразумевает сетевое устройство между двумя, возможно, маршрутизатором. Маршрутизаторы обычно настроены на запрет широковещательных пакетов между управляемыми подсетями, чтобы избежать broadcast storm.

    Если это ваша собственная экспериментальная сеть, на которой вы владеете маршрутизаторами, тогда вы сможете самостоятельно войти в конфигурацию маршрутизатора и изменить конфигурацию маршрутизатора.

  2. Если вы сделали (1) и все еще не работаете, посмотрите на TTL пакетов, которые вы генерируете. Если их отправляют с TTL одного (часто по умолчанию для широковещательной/многоадресной рассылки по соображениям безопасности), вам нужно увеличить его на единицу для каждого сетевого устройства, которое вы должны пройти по пути, потому что каждое устройство уменьшает TTL и упадет пакет, если достигнут нуль.

+0

Я пробовал такой же сценарий с помощью стороннего инструмента из EMCO с сайта http://emcosoftware.com/wake-on-lan, и он смог разбудить мою систему C из системы B. Поэтому я думаю, что ваше предложение точка 1 в порядке. Так что я могу сделать дальше. как увеличить TTL от python – Rao

+0

Это может быть опция 'IP_TTL' для' setsockopt'. Попытайтесь захватить свои широковещательные пакеты на другом ПК в той же подсети, используя Wireshark, и проверьте IP-заголовок. –

+0

Добавлен снимок полученного пакета в той же подсети, позвольте мне, что я могу сделать дальше. какой будет заголовок IP, о котором вы говорите. – Rao

Смежные вопросы