2014-07-10 54 views
0

我想在同一個程序中運行2個阻塞循環。 在我的程序中,我使用nfqueue來攔截數據包。當隊列被創建時,它開始等待數據包並阻止程序。當數據包到達時,它會調用cb()函數,然後再次開始監聽新數據包。在同一個程序中運行2個阻塞循環

這裏是我的程序:

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

提示:你需要使用線程,運行每個環上的一個單獨的一個 – goncalopp

+0

但在創建第一個線程時,阻塞循環將啓動,然後無法創建第二個線程 – HaTiMuX

+0

@HaTiMuX阻塞循環應該在其自己的線程中運行,因此它不會阻塞主線程的執行。 – dano

回答

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() 
+0

我得到這個錯誤:q = nfqueue.queue() AttributeError:'模塊'對象沒有屬性'隊列' – HaTiMuX

+0

@HaTiMuX您是否指定了您的名字文件'nfqueue.py'?如果是這樣,請將其重命名爲其他內容。 – dano

+0

謝謝,問題確實在文件名中。現在它的工作原理除了第二個線程在第一個運行隊列獲得2個數據包或3之前不會啓動。是否有任何方法可以避免這種情況並同時啓動2個線程? – HaTiMuX

相關問題