Hi.
Also ich bin ja erst ein paar Tage bei PB, aber Thread sind in PB sehr wohl stabil. Unstabil ist höchstens die Programmierweise. Überall wo gleichzeit auf den selben Speicherbereich geschrieben werden kann, stürzt das Programm früher oder später ab. Man muß wie in der Hilfe beschrieben die Betriebssystemeigene Syncronisierung nutzen (was auch immer das ist) oder dafür sorgen das dies nicht vorkommt bzw. ein SICHERS Flagsystem nutzen. Also weder PB noch Windows sind schuldig, nur unwissenheit oder ein Denkfehler bei euch.
Unabhängig davon sollte hier beachtet werden, das einige Systeme nur begrenzt Ressourcen zur Verfügung stellen (z.B. Win98) und auch die maximale gleichzeitige Verbindungsanzahl eingeschränktist / sein kann.
und wenn du schon die offenen Ports anzeigen willst, dann muß es "if ergebnis >= 1" heißen, sonst wird nicht angezeigt, falls nurein port offen ist.
Was noch zu bedenken sein solle ist, daß soweit ich das verstehe, mit "opennetworkconnection" nur dann eine verbindung aufgebaut wird, wenn auf dem Port ein SERVER wartet. Ist der Port zwar offen, aber keine "Software" wartet auf eingaben, dann wirft diese Abfrage nichts zurück. Auf jedenfall müßte es so nach meinem Verständnis sein.
Wie ich gerade feststellen mußte, kann selbst WindowsXP nur ca. maximal 2000 Thread pro Programm / Prozess laufen lassen(auf jedenfall mit PB), alle weiteren werden nicht erstellt, verschwinden also im Nirvana. Es hat schon seinen Grund, warum auch auf Websiten Ports nur nach und nach getestet werden (können). Achtet mal auf den XPTaskmonitor.
Man kann es eventl. noch etwas schneller machen (bei mir sind es ca. 4 minuten, aber dafür korrekt), aber hier kann man wenigstens wählen welcher portbereich man absuchen will. wenn man wirklichen den kompletten bereich absuchen will (und immer nur den), dann würde ich es anders machen. einfach weniger threads und in jedem thread mehrere ports abfragen.
ach ja,wie ihr seht, gibt es auf die art auch keine probleme mit der liste.
einzig die handles (threadid) wird im system nicht gelöscht (wärend laufzeit des programmes), auch wenn der thread beendet / durchlaufen ist.
laut hilfe muß man killthread ja nur nehmen, wenn man einen thread knallhart mittendrinn löschen will. also entweder ist die hilfe hier schlecht beschrieben oder PB hat einen bug.
Also wenn ihr einen besseren Code wollt (schneller), sagt bescheid.
Trotzdem mal mein Code(habe nur zwei oder drei Textzeilen übernommen):
Code: Alles auswählen
; Hinweis: An einer stelle im Code scheint wrend der Laufzeit ein Handle nicht zurckgegeben zu werden, evtl.
; Habe ich mit dem "Memory" noch was falsch gemacht.
OpenConsole()
InitNetwork()
NewList OpenPorts.l()
NewList Threads.l()
Global counter.l
Global counterW.l
*MEM.l
; erstellt von Thorsten Friedrichs 2005
Procedure PortCheckThread(*MEM.l)
*freemem.l = PeekL(*MEM+8)
;ConnectionID.l = OpenNetworkConnection("66.249.85.99", PeekL(*MEM+4)) ;google.de
ConnectionID.l = OpenNetworkConnection("127.0.0.1", PeekL(*MEM+4))
If ConnectionID
CloseNetworkConnection(ConnectionID)
EndIf
Repeat
Delay(1) ; nur zum schonen der Prozessorlast, was die Ausfhrung wiederum schneller macht
If counterW+350 < PeekL(*MEM) ; nur zum schonen der Prozessorlast, was die Ausfhrung wiederum schneller macht
Delay(1)
EndIf
If counterW+500 < PeekL(*MEM) ; nur zum schonen der Prozessorlast, was die Ausfhrung wiederum schneller macht
Delay(300)
EndIf
Until counterW = PeekL(*MEM) ;warte das vorheriger Thread Erlaubnis zum weitermachen gibt
If ConnectionID ; offenen Port in Liste speichern
AddElement(OpenPorts())
OpenPorts() = PeekL(*MEM+4)
EndIf
counterW = counterW + 1 ; nchsten Thread erlauben weiterzumachen
FreeMemory(*freemem)
EndProcedure
Procedure Thread(reserves.l)
counterW = 1
counter = 0
For Port = 1 To 65535 ; Fr jeden Port einen Thread starten
;AddElement(Threads())
counter = counter + 1
*MEM = AllocateMemory(12)
PokeL(*MEM, Counter)
PokeL(*MEM+4, PORT)
PokeL(*MEM+8, *MEM)
AddElement(Threads())
Threads() = CreateThread(@PortCheckThread(), *MEM)
;Delay(1)
While counter-counterw > 1900 ; <-- Wert gibt an, wieviele Connections max. gleichzeitig offen sein drfen; (noch recht ungenau)
; Hier wird angenommen, solange der angegebene Wert berschritten ist, genau diese Anzahl an Verbindungen
; noch aktiv ist. Da dieser Wert aber vom Counter, welcher Schrittweise abgearbeitet wird abgeleitet ist, wei das
;Programm natrlich nicht, ob nicht schon einige Verbindungen geschlossen sind, die noch nicht an der Reihe sind
;ihr Ergebnis zu senden. Man mte dafr eine eigene bessere Verwaltung bauen. Aber in diesem Beispiel
; drfte das nicht notwendig sein.
;XP wrde ich bis zu 1950 setzten, Win98 nur max. 100 evtl. 200
Delay(100)
Wend
Next
EndProcedure
Anfangszeit = ElapsedMilliseconds()
PrintN( "Starte PortCheck..." )
CreateThread(@Thread(), 0)
PrintN( "Warte, bis die Threads abgearbeitet sind..." )
Repeat
Delay (1000)
PrintN(Str(counter)+" : "+Str(counterW) + " offene Port, besser Server an Port -> Anzahl bisher: " + Str(CountList(OpenPorts())))
Until counterW >= counter
Endzeit = ElapsedMilliseconds()
PrintN( "Verarbeitung hat " + StrF((Endzeit - Anfangszeit)/1000) + " Sekunden gedauert." )
ForEach Threads() ; sonst bleibt ein handle im system brig, auch wenn laut hilfe das nicht sein drfte. vielleicht ein Bug.
KillThread(Threads() )
Next ;PS. handel werden hier wohl auch nicht freigegeben, ist wohl ein Bug.
Ergebnis = CountList(OpenPorts()) ; Jetzt schauen wir uns mal das Ergebnis an.
If Ergebnis >= 1
PrintN( Str(Ergebnis) + " offene Ports gefunden. Geffnet sind:" )
ForEach OpenPorts()
PrintN( Str(OpenPorts()) )
Next
Else
PrintN( "Keine Ports offen." )
EndIf
PrintN("Programm beendet." )
Repeat
Delay(10)
Until 0
CloseConsole()
End
Gruß
Toshy