2014-07-10 2 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: объект 'module' не имеет атрибута 'queue' – HaTiMuX

+0

@HaTiMuX Вы назвали ваш файл 'nfqueue.py'? Если это так, переименуйте его в другое. – dano

+0

Спасибо, проблема была в имени файла. Теперь он работает, за исключением того, что второй поток не запускается до тех пор, пока первая работающая очередь не получит 2 пакета или 3. Есть ли способ избежать этого и запустить 2 потока одновременно? – HaTiMuX

Смежные вопросы