IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Question liée au multiprocessing [Débutant(e)]


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Question liée au multiprocessing
    Bonjour,

    Je tente de faire un programme ayant pour but de scan une ip sur une tranche de port indiqué . Le but étant de faire en sorte que le scan utilise plusieurs processus (dans un but de comprehension du principe).

    Donc voici la "fonction" dans le processus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        def proc1() :
        name = multiprocessing.current_process().name
        for i in range(1,10):
         print "Creating workerThread: %d"%i
         worker = WorkerThread(queue, i)
         worker.setDaemon(True)
         worker.start()
         threads.append(worker)
         print "WorkerThread %d Created"%i
        for j in range (1,1000) :
         queue.put(j)
        queue.join()
        for item in threads :
         item.join()
        print "Scan Done! Proc1"
    Je termine le programe avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    queue = Queue.Queue()
    threads = []
    proc_1 = multiprocessing.Process(name='proc1', target = proc1)
    proc_2 = multiprocessing.Process(name='proc2', target = proc2)
    proc_1.start()
    proc_2.start()
    print "Terminer ici !"
    Le second proc ne possède rien du tout je vais simplement link le programe que j'ai écris pour le moment en entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    import threading
    import Queue
    from scapy.all import *
    import multiprocessing
    import time
    class WorkerThread(threading.Thread) :            
    	def __init__(self,Queue, tid) :
    		threading.Thread.__init__(self)
    		self.queue = queue
    		self.tid = tid
    		print "Worker %d Reporting for Service Sir!"%self.tid
    	def run(self):
    		total_ports = 0
    		while True:
    			port = 0
    			try :
    				port = self.queue.get(timeout=1)
    			except Queue.Empty :
    				print "Worker %d exiting.Scanned %d ports .."%(self.tid, total_ports)
    				return                         #Probleme de fin de boucle ici
    			ip = sys.argv[1]
    			response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"), verbose=False, timeout=.2)
    			if response :
    				if response[TCP].flags == 18 :
    					print "ThreadId %d : Received Port number %d Status : OPEN"%(self.tid, port)
    				self.queue.task_done()
    				total_ports +=1
    def proc1() :
    	name = multiprocessing.current_process().name
    	for i in range(1,10):
    		print "Creating workerThread: %d"%i
    		worker = WorkerThread(queue, i)
    		worker.setDaemon(True)
    		worker.start()
    		threads.append(worker)
    		print "WorkerThread %d Created"%i
    	for j in range (1,1000) :	
    		queue.put(j)
    	queue.join()
    	for item in threads :
    		item.join()
    	print "Scan Done! Proc1"	
    def proc2() :
    	name = multiprocessing.current_process().name
    	print name, "Starting processeur 2"
    queue = Queue.Queue()
    threads = []
    proc_1 = multiprocessing.Process(name='proc1', target = proc1)
    proc_2 = multiprocessing.Process(name='proc2', target = proc2)
    proc_1.start()
    proc_2.start()
    print "Terminer ici !"
    Donc le code a l'air de marcher correctement sauf que le premier processus ne se termine jamais je ne sais pas vraiment comment faire pour faire en sorte de sortir de la boucle while puisque si je demande la fin manuellement ca m'indique un message d'erreur (normal).
    J'ai aussi un autre soucis lors de la reception du message d'indication du nombre de port scan par chaque thread ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Worker %d exiting.Scanned %d ports .."%(self.tid, total_ports)
    Ca m'indique simplement le thread qui m'a trouvé un port ouvert comme si dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Worker 5 exiting.Scanned 0 ports ..
    Worker 7 exiting.Scanned 0 ports ..
    Worker 3 exiting.Scanned 0 ports ..
    Worker 9 exiting.Scanned 0 ports ..
    Worker 1 exiting.Scanned 0 ports ..
    Worker 4 exiting.Scanned 0 ports ..
    Worker 2 exiting.Scanned 1 ports ..
    Worker 8 exiting.Scanned 0 ports ..
    Worker 6 exiting.Scanned 0 ports ..
    Alors qu'en théorie ca devrait simplement indiqué le nombre de port scanné par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Worker 8 exiting. Scanned 111 ports ..
     Worker 3 exiting. Scanned 110 ports ..
     Worker 7 exiting. Scanned 110 ports ..
     Worker 6 exiting. Scanned 111 ports ..
     Worker 1 exiting. Scanned 111 ports ..
     Worker 5 exiting. Scanned 112 ports ..
     Worker 4 exiting. Scanned 111 ports ..
     Worker 9 exiting. Scanned 112 ports ..
     Worker 2 exiting. Scanned 111 ports ..
    Scan Done!
    Enfin je me demande lorsque j'aurais trouver la solution à tout ces problèmes si lorsque je vais utiliser la même fonction dans un second processus (avec une liste de port différente) est-ce je risque d'avoir des problèmes.

    Merci beaucoup pour votre patience pour les courageux ayant lu ce long post ainsi que pour votre aide par avance.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Je pense que tes problèmes proviennent tous deux de la fin de ta fonction run() du WorkerThread*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"), verbose=False, timeout=.2)
    			if response :
    				if response[TCP].flags == 18 :
    					print "ThreadId %d : Received Port number %d Status : OPEN"%(self.tid, port)
    				self.queue.task_done()
    				total_ports +=1
    self.queue.task_done() et total_ports += 1 ne sont exécutés que si response est évaluable à True (donc si c’est None, ou une liste vide, etc., ce code n’est jamais exécuté, donc à moins que tous les ports testés soient ouverts, le queue n’est jamais entièrement vidée, donc ton .join() bloque ad vitam aeternam*!).

    Amha, ceci devrait résoudre ces problèmes*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"), verbose=False, timeout=.2)
    			if response :
    				if response[TCP].flags == 18 :
    					print "ThreadId %d : Received Port number %d Status : OPEN"%(self.tid, port)
    			self.queue.task_done()
    			total_ports +=1

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Ha oui en effet c'est un peu idiot comme oublie .

    Bref ben merci beaucoup d'avoir pris du temps pour m'aider .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WAMP] Questions liées au réseau
    Par steeve93800 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 08/02/2008, 12h33
  2. [Htaccess] Petites questions liées à la sécurité
    Par jeanphi6 dans le forum Apache
    Réponses: 4
    Dernier message: 21/11/2007, 08h50
  3. Question liée à memset
    Par progfou dans le forum C++
    Réponses: 28
    Dernier message: 21/06/2007, 18h39
  4. Petite question liée aux structures
    Par progfou dans le forum C++
    Réponses: 9
    Dernier message: 24/04/2007, 13h46
  5. Petite question liée au Javascript
    Par systemofaxav dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/03/2006, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo