2016-07-16 3 views
2

Я вытащил следующий код из пакета txtnettools на git-хабе, код в основном неполный, поэтому я пытаюсь выяснить, как на самом деле сделать код для отправки пакетов, которые мне нужно вызвать. Я думаю, что метод sendEcho() как реактор, поэтому я добавил соответствующую линию.Ошибка Twisted ExtendSelected Reactor

from random import randint 
import socket 
import struct 

from twisted.internet.protocol import DatagramProtocol 

# needs to be run with sudo, so let's add the dev path 
import sys 
sys.path.insert(0, ".") 

from txnet.icmp import * 
from txnet.reactor import reactor 


UDP_PORT_MIN = 33434 
UDP_PORT_MAX = 33534 


def get_remote_port(): 
    return randint(UDP_PORT_MIN, UDP_PORT_MAX) 


class Pinger(ICMP): 

     def sendEcho(self): 
      print "Sending echo ..." 
      src = "192.168.1.1" 
      print src 
      #dst = "127.0.0.1" 
      #dst = "192.168.1.1" 
      #dst = "192.168.100.1" 
      dst = "74.125.45.100" 
      self.transport.connect(dst, get_remote_port()) 
      # Construct a ping packet (with useless payload data). 
      packet = Packet(src=src, dst=dst, type=ECHO_REQUEST, payload="txNetTools ping") 
      raw = packet.getDatagram() 
      self.transport.write(packet.getDatagram()) 

    def startProtocol(self): 
     print "Transport is:", self.transport 
     print "Transport class is:", self.transport.__class__ 
     print "self is:", self 
     self.sendEcho() 

    def connectionRefused(self): 
     print "Connection refused ..." 
     print "Host:", self.transport.getHost() 
     print "Remote host:", self.transport._connectedAddr 
     print "Connected:", self.transport.connected 
     print "Disconnected:", self.transport.disconnected 
     print "Data buffer:", self.transport.dataBuffer 

reactor.Pinger.sendEcho() #Throwing error 
reactor.listenICMP(0, Pinger()) 
reactor.run() 

Rector.pinger.sendEcho() Однако при запуске этого скрипта я получаю следующую ошибку.

Traceback (most recent call last): 
    File "ping.py", line 54, in <module> 
    reactor.Pinger.sendEcho() 
AttributeError: 'ExtendedSelectReactor' object has no attribute 'Pinger' 

погуглить «ошибка ExtendedSelectRector» или что угодно близкие yeilds буквально нет решений или болтовня. Благодаря

Edit: здесь проекты источник GitHub https://github.com/oberstet/txnettools

ответ

1

Ответ был полностью в том, как я был доступ к классу Pinger. Скорректированная строка кода будет

reactor.callWhenRunning(Pinger().sendEcho) 

Вместо:

reactor.Pinger.sendEcho() 

Вы должны указать в реактор, как, когда и как перенести себя, когда вы создаете новый.