簡體   English   中英

Python隊列和線程混淆

[英]Python Queue and Threading confusion

我用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

我想我解決了。 我更改了這一行:

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

這意味着,在將ts和pkt添加到隊列之前,我將其轉換為字符串。

少數數據包的大小對於4-6個字節仍然不同,但非線程版本的情況也是如此。 我可能會在新帖子中詢問這個問題。

謝謝大家的幫助!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM