Scapy stop_filter导致巨大的内存泄漏

时间:2019-03-19 05:58:45

标签: python python-3.x memory-leaks scapy libpcap

我有一个启动虚拟主机的应用程序。我注意到,记忆力正在随着时间的推移迅速增加。经过许多尝试寻找原因的尝试后,事实证明原因是使用stop_filter中的scapy

以下简化代码是可运行的,您只需复制/粘贴即可:

from scapy.all import *
import threading
from time import sleep

def stopFilter(packet):
    if ICMP in packet:
        if packet[1].dst == '192.168.0.70':
            print('packet found')
            return True
def host():
    while True:
        sniff(iface="Intel(R) PRO/1000 PT Dual Port Server Adapter #2", timeout=2, stop_filter=stopFilter, store=0)
        sleep(2)

for i in range(200):
    print(i)
    t = threading.Thread(target=host)
    t.start()
    sleep(0.1)

当然,您需要更改适配器和IP。另外,在运行代码时使用ping -t进行IP设置,以便stopFilter()可以正常工作。片刻之后,您可以看到内存在增加。 I think similar issue in C with libpcap.

有什么解决方法吗?

环境:Python 3.6.0,Win 7,Scapy 2.4.0(Scapy 2.4.2中存在相同问题)

1 个答案:

答案 0 :(得分:0)

我自己解决了此问题。只需转到~Lib\site-packages\scapy\sendrecv.py及其下的

if stop_filter and stop_filter(p):替换:

sniff_sockets = []
break

具有:

for s in sniff_sockets:
     s.close()
del sniff_sockets
return   

现在内存问题消失了。

更新

上述解决方案仅在2.4.0中有用(无内存泄漏),而在2.4.1和2.4.2中没有帮助