我想在同一个程序中运行2个阻塞循环。 在我的程序中,我使用nfqueue来拦截数据包。创建队列时,它开始等待数据包并阻止程序。当数据包到达时,它将调用cb()函数,然后再次开始侦听新数据包。
这是我的计划:
import nfqueue, socket
from scapy.all import *
import os
os.system('iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 1')
os.system('iptables -t mangle -A POSTROUTING -j NFQUEUE --queue-num 2')
count = 0
def cb(payload):
global count
count +=1
data = payload.get_data()
p = IP(data)
print str(count) + ": TOS = " + str(p.tos)
payload.set_verdict(nfqueue.NF_ACCEPT)
def run_queue(queue_num):
print "Preparing the queue"
q = nfqueue.queue()
q.open()
q.unbind(socket.AF_INET)
q.bind(socket.AF_INET)
q.set_callback(cb)
q.create_queue(queue_num)
try:
print "Running the queue"
q.try_run()
except KeyboardInterrupt, e:
print "interruption"
q.unbind(socket.AF_INET)
q.close()
run_queue(1)
run_queue(2)
如何在同一程序中运行2个或更多这些阻塞循环?
非常感谢任何帮助。 谢谢!
答案 0 :(得分:1)
您可以在自己的线程中运行每个循环,如下所示:
import nfqueue, socket
from threading import Thread
from scapy.all import *
import os
os.system('iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 1')
os.system('iptables -t mangle -A POSTROUTING -j NFQUEUE --queue-num 2')
count = 0
def cb(payload):
global count
count +=1
data = payload.get_data()
p = IP(data)
print str(count) + ": TOS = " + str(p.tos)
payload.set_verdict(nfqueue.NF_ACCEPT)
def run_queue(queue_num):
print "Preparing the queue"
q = nfqueue.queue()
q.open()
q.unbind(socket.AF_INET)
q.bind(socket.AF_INET)
q.set_callback(cb)
q.create_queue(queue_num)
try:
print "Running the queue"
q.try_run()
except KeyboardInterrupt, e:
print "interruption"
q.unbind(socket.AF_INET)
q.close()
if __name__ == "__main__":
t1 = Thread(target=run_queue, args=(1,))
t1.start()
t2 = Thread(target=run_queue, args=(2,))
t2.start()
t1.join()
t2.join()