Python队列和线程混淆

时间:2015-07-08 16:21:21

标签: python multithreading

我在Python中制作了一个嗅探器,用于计算IP数据包的大小。我试图通过两种方式获得尺寸:

1)只需计算len(pkt)

2)从IP报头中提取数据包长度,并为以太网报头添加14字节

当将len(pkt)的结果与IP头中提取的值进行比较时,它们几乎总是相同的(好吧,对于极少数数据包,有4-6个字节的差异,但那是另一个问题)。

但是一旦我实现了队列和线程到我的代码中,len(pkt)的大小和IP头中的提取值在大多数情况下完全不同。有时只有几个字节,有时几百个字节。但很少有相同的东西。

我实现线程的代码如下。如果我在实施线程/队列或我做错了的方式上犯了错误,有没有人知道?

import pcap
import struct
import dpkt
from Queue import Queue
from threading import Thread

def packet_handler():
    ts,pkt=q.get()
    eth=dpkt.ethernet.Ethernet(pkt)
    if eth.type != dpkt.ethernet.ETH_TYPE_IP:
        return
    a=struct.unpack('!BBHHHBBH4s4s', pkt[14:34])
    print a[2]+14,len(pkt)

def start():  
    pc.loop(0,lambda ts,pkt: q.put((ts,pkt)))

q=Queue()
pc=pcap.pcap(name="eth0")
start_sniffer=Thread(target=start)
start_sniffer.start()

while True:
    packet_handler()

部分输出如下:

419 1454
419 419
54 60
389 60
389 389
405 60
405 405
405 60
405 405
54 60
54 60
493 491
491 492
491 493
491 491
502 502
54 60

1 个答案:

答案 0 :(得分:0)

我想我解决了。我更改了这一行:

pc.loop(0,lambda ts,pkt: q.put((str(ts),str(pkt))))

这意味着,我在将ts和pkt添加到队列之前将其转换为字符串。

少数数据包的大小对于4-6个字节仍然不同,但非线程版本的情况也是如此。我可能会在一篇新帖子中询问这个问题。

感谢大家的帮助!!!