gpt4 book ai didi

Python队列和线程混淆

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:15 26 4
gpt4 key购买 nike

我用 Python 做了一个嗅探器来计算 IP 数据包的大小。我尝试通过两种方式获取尺寸:

1) 简单地通过计算 len(pkt)

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

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

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

下面是我实现线程的代码。如果我在实现线程/队列的方式上犯了错误或者我做错了什么,有人知道吗?

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

最佳答案

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

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

也就是说,我在将 ts 和 pkt 添加到队列之前将它们转换为字符串。

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

谢谢大家的帮助!!!

关于Python队列和线程混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31298298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com