Seite 1 von 1

Problem mit Module _thread (Python3.0)

Verfasst: Mittwoch 6. Mai 2009, 14:37
von SimpleSebi
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

Verfasst: Mittwoch 6. Mai 2009, 14:45
von numerix
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.

Verfasst: Mittwoch 6. Mai 2009, 14:46
von DasIch
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.

Verfasst: Mittwoch 6. Mai 2009, 15:06
von cofi
Übrigens dürfte ein Portscanner unter StGB §202c (Hackerparagraph) fallen und da der so schwammig formuliert ist ... ;)

Verfasst: Mittwoch 6. Mai 2009, 15:10
von SimpleSebi
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?

Verfasst: Mittwoch 6. Mai 2009, 15:15
von DasIch
Ein Unterstrich weißt darauf hin dass man was auch immer es ist besser nicht anfasst.

Verfasst: Mittwoch 6. Mai 2009, 15:22
von SimpleSebi
Hallo,
wie könnte man des den anders lösen außer mit globalen Variablen?

Verfasst: Mittwoch 6. Mai 2009, 15:31
von Leonidas
Mit einer Klasse.

Verfasst: Mittwoch 6. Mai 2009, 15:31
von cofi
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

Verfasst: Mittwoch 6. Mai 2009, 15:39
von 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.

Verfasst: Mittwoch 6. Mai 2009, 15:48
von numerix
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:

Verfasst: Mittwoch 6. Mai 2009, 16:00
von SimpleSebi
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!