我有一个代码,我想同时运行函数cek_paket()
和delete_paket()
。我的朋友建议我使用线程。所以不久,我用它来嗅探arp数据包,并将信息(源,目标地址和到达的数据包数量)保存到字典python中的列表中。因此sniff()
函数是我用来嗅探数据包的功能。数据包到达后,它将返回到cek_paket()
以将信息保存到jumlah_reply列表。我使用delete_reply()
每3秒删除第一个列表(jumlah_reply [0])。我在cek_paket()
函数中没有问题。问题是,为什么sniffing()
函数仅起作用?但是delete_reply函数不起作用?
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_reply()函数没有采取任何措施。为什么会这样呢? scapy的sniff()函数会锁定所有进程吗?