为什么线程不能在pythonscapy上使用sniff()函数?

2024-06-16 11:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个代码,我想同时运行函数cek_paket()delete_paket()。我的朋友建议我用线。很快,我就用它来嗅探arp包,并将信息(源地址、目的地址和包到达的数量)保存到python字典的列表中。所以sniff()函数是scapy用来嗅探数据包的函数。数据包到达后,它将返回cek_paket(),将信息保存到jumlah\u回复列表。我使用delete_reply()每3秒钟删除一次第一个列表(jumlah\u reply[0])。我在cek_paket()函数中没有问题。问题是,为什么sniffing()函数只能工作?但是删除回复功能不起作用?你知道吗

from scapy.all import*
import thread
import time
jumlah_reply = []
def cek_paket(pkt):

    if pkt[ARP].op ==2:
        destinasi = str(pkt[ARP].pdst)
        source = str(pkt[ARP].psrc)
        dikirim = {'src':source,'dst':destinasi}
        if len(jumlah_reply)==0:
            dikirim['count']=1
            jumlah_reply.append(dikirim)
            found = True
        else:   
            found=False
            for itung in jumlah_reply:
                if itung['src']==dikirim['src'] and itung['dst']==dikirim['dst']:
                    itung['count']+=1
                    found = True
                    break
        if not found:
            jumlah_reply.append(dikirim)
            dikirim['count']=1
    print("reply")
    print(jumlah_reply)
    print("--------------------------------")

def delete_paket():
    if len(jumlah_reply) > 0:
        del jumlah_reply[0]
        print("*********************")
        print (jumlah_reply)
        print("**********************")
    time.sleep(3)
def sniffing():
    sniff(prn=cek_paket,filter="arp",store=0)

try:
    thread.start_new_thread(sniffing())
    thread.start_new_thread(delete_paket())
except:
    print("error")
while 1:
    pass

我期待着结果: 当有ARP应答包时,信息将被添加到列表中,3秒钟后,第一项将被删除。但实际产出是

如您所见,信息包已添加到列表中,但我已运行代码一分钟,delete\u reply()函数没有任何操作。为什么会这样?scapy lock的sniff()函数是整个过程的一部分吗?你知道吗


Tags: 函数信息列表ifdeletereplythreadprint