Python Scapy sniff()在子类threading.Thread()的类中

Python Scapy sniff()在子类threading.Thread()的类中,python,multithreading,queue,scapy,packet-sniffers,Python,Multithreading,Queue,Scapy,Packet Sniffers,我对Scapy sniff()函数有一个奇怪的问题 这就是我们班的情况: from scapy.all import * import sys import datetime import Queue from threading import Thread class packet_sniffer(Thread): def __init__(self,pass_queue): super(packet_sniffer,self).__init__() print

我对Scapy sniff()函数有一个奇怪的问题

这就是我们班的情况:

    from scapy.all import *
import sys
import datetime
import Queue
from threading import Thread

class packet_sniffer(Thread):
  def __init__(self,pass_queue):
    super(packet_sniffer,self).__init__()
    print 'Packet sniffer started'
    self.queue=pass_queue
    self.device_dict={}
    self.not_an_ap={}


  def PacketHandler(self,pkt):
    if pkt.haslayer(Dot11):
      sig_str = -(256-ord(pkt.notdecoded[-4:-3]))
      mac_addr=""
      ssid=""
      try:
        mac_addr=pkt.addr2
        ssid=pkt.info
      except:
        return
      if self.device_dict.has_key(pkt.addr2) and pkt.info!=self.device_dict[pkt.addr2]:
        output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str)
        print output
        self.device_dict.pop(pkt.addr2)
        self.not_an_ap[pkt.addr2]=pkt.info
        self.queue.put(output)
      elif pkt.info=="" or pkt.info=="Broadcast":
        output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str)
        print output
        self.queue.put(output)
      else:
        pot_mac=self.not_an_ap.get(pkt.addr2)
        if pot_mac == None:
          self.device_dict[pkt.addr2]=pkt.info

    def run(self):
      sniff(iface="mon.wlan0",prn=self.PacketHandler)
当我从线程管理器类调用此代码时,此代码不起作用:

编辑:当我说它不工作时,我的意思是嗅探要么不工作,要么没有调用PacketHandler。不会输出任何错误消息,程序的其余部分将继续正常运行

currentQueue=Queue()

#object setup
print'Initialising sniffer'
packet_sniffer_instance=packet_sniffer(currentQueue)
packet_sniffer_instance.daemon=True
packet_sniffer_instance.start()
time.sleep(1)

print'Finished initialising sniffer'
在看了这篇文章之后,我加入了睡眠功能:

但是,当我将sniff调用移动到
\uuuu init\uuuu()
函数时,它可以工作,但是由于packet\u sniffer类无限地卡在
\uuu init\uuuuu()
函数中,因此无法调用后续线程

谈到python,我是一个相当新的程序员(总体来说,我不是一个新的程序员,我有很多经验),所以我可能在做一些非常基本的错误

短暂性脑缺血发作


James.

似乎简单地重新安排类,使
运行
方法正好位于
\uuuu init\uuuu()
方法之下,就解决了这个问题。我还停止使用thread类,使用了multiprocess类,它构建在thread类的基础上,但允许更大的并发性

最后一个类如下所示:

from scapy.all import *
import sys
import datetime
import Queue
from multiprocessing import Process

class packet_sniffer(Process):
  def __init__(self,pass_queue):
    super(packet_sniffer,self).__init__()
    print 'Packet sniffer started'
    #self.target=self.monitor()
    self.queue=pass_queue
    self.device_dict={}
    self.not_an_ap={}
    print 'END'

  def run(self):
    sniff(iface="en1",prn=self.PacketHandler)

  def PacketHandler(self,pkt):
    if(pkt.haslayer(ARP)):
      print pkt.src
    if pkt.haslayer(Dot11):
      sig_str = -(256-ord(pkt.notdecoded[-4:-3]))
      mac_addr=""
      ssid=""
      try:
        mac_addr=pkt.addr2
        ssid=pkt.info
      except:
        return
      if self.device_dict.has_key(pkt.addr2) and pkt.info!=self.device_dict[pkt.addr2]:
        output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str)
        print output
        self.device_dict.pop(pkt.addr2)
        self.not_an_ap[pkt.addr2]=pkt.info
        self.queue.put(output)
      elif pkt.info=="" or pkt.info=="Broadcast":
        output= "DIS MAC:%s RSSI:%s " %(pkt.addr2,sig_str)
        print output
        self.queue.put(output)
      else:
        pot_mac=self.not_an_ap.get(pkt.addr2)
        if pot_mac == None:
          self.device_dict[pkt.addr2]=pkt.info

我不完全清楚为什么在这种情况下,方法的安排会产生不同。

你说的“不起作用”是什么意思?@dano我会澄清的。当我说它不工作时,我的意思是嗅探要么不可操作,要么没有调用PacketHandler。不会输出任何错误消息,程序的其余部分将正常运行。能否验证是否正在调用
run
?(只需在那里抛出一个
print
语句即可)。在
PacketHandler
的顶部也放置一个打印。您应该能够通过使用
print
跟踪流来找出问题的症结或失败之处。我总是使用print语句,但我不认为在run方法中使用print,因为其他类具有相同的结构,它们的run方法工作得很好。在包嗅探器类中,既不调用包处理程序也不调用run方法,但init方法按预期工作。有什么建议@dano