Problem mit Module _thread (Python3.0)

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

Problem mit Module _thread (Python3.0)

Beitragvon SimpleSebi » Mittwoch 6. Mai 2009, 14:37

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

Beitragvon numerix » Mittwoch 6. Mai 2009, 14:45

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: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Mittwoch 6. Mai 2009, 14:46

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
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Mittwoch 6. Mai 2009, 15:06

Ü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

Beitragvon SimpleSebi » Mittwoch 6. Mai 2009, 15:10

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: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Mittwoch 6. Mai 2009, 15:15

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

Beitragvon SimpleSebi » Mittwoch 6. Mai 2009, 15:22

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

Beitragvon Leonidas » Mittwoch 6. Mai 2009, 15:31

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

Beitragvon cofi » Mittwoch 6. Mai 2009, 15:31

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

Beitragvon BlackJack » Mittwoch 6. Mai 2009, 15:39

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

Beitragvon numerix » Mittwoch 6. Mai 2009, 15:48

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

Beitragvon SimpleSebi » Mittwoch 6. Mai 2009, 16:00

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!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder