Problem mit Module _thread (Python3.0)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

Hallo,
ich code mir gerade einen kleinen Portscanner in Python3.0 und wollte an dieser Stelle mal die Threads so n bisschen ausprobieren: Jeder Thread ist für einen bestimmten Portbereich zuständig und speichert das Ergebnis in eine globale Liste. Damit immer nur ein Thread auf die Liste zugreifen kann, habe ich die Liste mit _thread.lock gesperrt. Nur bricht er jedesmal an dieser Stelle mit einer Exception ab.
Kann mir bitte jemand sagen, warum?

Code: Alles auswählen

# Imports
import socket
import _thread


def portscan(hostIP, startPort, endPort):
    for i in range(startPort, endPort):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        res = s.connect_ex((hostIP, i))
        if res == 0:
            answer = "Port "+str(i)+" is open"
        else:
            answer = "Port "+str(i)+" is closed"
        global liste
        _thread.lock.acquire()
        liste.append(answer)
        _thread.lock.release()
        s.close()

liste = {}

_thread.start_new_thread(portscan, ("127.0.0.1", 1, 10))
_thread.start_new_thread(portscan, ("127.0.0.1", 11, 20))
_thread.start_new_thread(portscan, ("127.0.0.1", 21, 30))

for i in liste:
    print(i)

Mit freundlichen Grüßen,
Sebastian
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Auch wenn es nicht die Lösung des Problems ist, das dich stört:

Deine Liste ist gar keine Liste, sondern ein Dictionary.
Und die global-Anweisung ist überflüssig.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Unterstrich vor thread ist nicht zum Spass da, du solltest statt _thread threading benutzen.

Dein Lock handling ist total kaputt und vergiss besser gleich wieder dass es global gibt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Übrigens dürfte ein Portscanner unter StGB §202c (Hackerparagraph) fallen und da der so schwammig formuliert ist ... ;)
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

DasIch hat geschrieben:Der Unterstrich vor thread ist nicht zum Spass da, du solltest statt _thread threading benutzen.

Dein Lock handling ist total kaputt und vergiss besser gleich wieder dass es global gibt.
Hallo,
blöde Frage, aber heßt _ModuleX soviel wie depricated?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ein Unterstrich weißt darauf hin dass man was auch immer es ist besser nicht anfasst.
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

Hallo,
wie könnte man des den anders lösen außer mit globalen Variablen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mit einer Klasse.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du könntest das mit einer Klasse kapseln.
Aber das wurde gar nicht kritisiert. Das `global`-Statement ist überflüssig, da man mutables, wie in dem Fall deine Liste - und das nächste Mal bitte mit den richtigen Klammern, sowieso verändern kann
BlackJack

Wenn Du eine Ausnahme bekommst, solltest Du die auch zeigen. In diesem Fall würde ich folgende vermuten:

Code: Alles auswählen

In [19]: liste = {}

In [20]: liste.append(42)
---------------------------------------------------------------------------
<type 'exceptions.AttributeError'>        Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.AttributeError'>: 'dict' object has no attribute 'append'
Und jetzt die Frage: Wieso hilft die Dir nicht dabei den Fehler selber zu finden? Die ist doch ziemlich eindeutig.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:Wenn Du eine Ausnahme bekommst, solltest Du die auch zeigen. In diesem Fall würde ich folgende vermuten:
Ich hab den Code mal laufen lassen - bis an die Stelle ist das Programm gar nicht gekommen .... Die Fehlermeldung bei mir sah so aus:

Code: Alles auswählen

Unhandled exception in thread started by 
Error in sys.excepthook:

Original exception was:
Unhandled exception in thread started by 
Error in sys.excepthook:

Original exception was:

Error in sys.excepthook:

Original exception was:
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

Hallo,
bei mir sah die Fehlermeldung so aus:

Code: Alles auswählen

>>> Unhandled exception in thread started by Unhandled exception in thread started by Unhandled exception in thread started by <function portscan at 0x02C33540><function portscan at 0x02C33540><function portscan at 0x02C33540>
Daher war ich anfangs etwas vewirrt. Das Problem ist jetzt gelöst, danke!
Antworten