Seite 3 von 5
Verfasst: 03.11.2005 17:52
von Laurin
Friedrichs hat geschrieben:sondern die Aussage das Thread in PB instabil sind. Das sind sie an sich nicht.
Fred, der Programmierer von PB, hat selbst zugegeben, das das Threadsystem nicht so das Wahre ist

Deshalb hat er das auf die ToDo-Liste gesetzt
Es war kein Meckern an deinem Wissen in Pb oder das du "ne Niete" bist,
Mit dieser Aussage hast du mich wieder freundlich gestimmt
Handelbug
*hust* Hand
le *hust*
aber eine gut durchdachte Struktur bleibt eine gut durchdachte Struktur und die ist mit das Schwerste.
Das finde ich eigendlich nicht so schwer. Am schwierigsten sind meiner Meinung nach immernoch die ganzen Feinheiten. Die haben immer die Eigenart ganz plötzlich ein paar Stunden Programmierarbeit zunichte zu machen.
Gruß
Toshy
Greetz Laurin
Verfasst: 03.11.2005 18:03
von DarkDragon
Laurin hat geschrieben:Handelbug
*hust* Hand
le *hust*
Schön, dass das mal erwähnt wird, wenn ich "Handel"(Händel) lese denk ich immer an n Hänchen mit Pommes.
Verfasst: 03.11.2005 18:23
von Toshy
Fred, der Programmierer von PB, hat selbst zugegeben, das das Threadsystem nicht so das Wahre ist

Deshalb hat er das auf die ToDo-Liste gesetzt

.
Da habe und werde ich dir recht geben. Aber fehlerhaft nur in dem Sinne, das man den Ablauf / Syncronistaion einbauen könnte usw. NICHT im Sinne von "Thread stürzt ab, nur weil er da ist;-)"
Mit dieser Aussage hast du mich wieder freundlich gestimmt

Das ist schön, du "Klammer"
*hust* Handle *hust*
keuch echz. keine ahnung ob es ein Tipfehler war oder mal wieder falsch. ich bin mir nicht sicher bei dem Engleiche /amerikanischen LE und EL.
Das finde ich eigendlich nicht so schwer. Am schwierigsten sind meiner Meinung nach immernoch die ganzen Feinheiten. Die haben immer die Eigenart ganz plötzlich ein paar Stunden Programmierarbeit zunichte zu machen.
Da kann ich dir nur recht geben, das hält auf. Aber die Struktur ist schon wichtig, sehr wichtig. Denn am optimalsten geht das was ich machen will mit Thread, aber wenn Daten ausgetauscht werden müssen oder zugriff auf die selben Speicherdaten, so muß man ganz genau strukturieren, damit das programm an der richtigen stelle wartet bzw. nicht in einer endloswarteschleife hängt, weil Threads gegenseitig aufeinander warten. Ich zerbreche mir da auch gerade den Kopf, aber irgendwie bekomme ich das hin.
Aber stimmt alles schon, Thread und Listen bringen mich gerade an den Rand des Wahnsinns
Gruß
Toshy
Verfasst: 03.11.2005 22:04
von PureFan
Hier mal ein Beispiel, wie man einen Portscann am besten machen sollte.
Dauernd Threads zu killen und neu zu erstellen halte ich persönlich nicht für sinnvoll, viel besser ist es die Anzahl der Threads konstant zu halten!
Das ganze System ist im Prinzip eine Art Automat zum Nummern ziehen. Solange Nummern vorhanden sind "zieht" sich jeder Thread eine und führt die Überprüfungen durch! Dadurch sind Konflike zwischen den Threads ausgeschlossen.
Hier im Test wird "localhost" gescannt, dadurch sind auch 1000 Überprüfungen gleichzeitig möglich (#ChecksAtSameTime)! Sollte der Code aber für das Internet umgebaut werden ist es unbedingt notwendig die Anzahl zu reduzieren, da es sonst zu Verbindungs-Überlastungen und Timeouts bei anderen Programmen kommen kann.
Code: Alles auswählen
;- PureFan's Critical Section
DisableDebugger
Structure Pure_CS
Cnt.l
EndStructure
Procedure Pure_InitCS(*PCS.Pure_CS)
*PCS\Cnt=0
EndProcedure
Procedure Pure_EnterCS(*PCS.Pure_CS)
!POP Edi ;POP/PUSH dient zum schnellen Einlesen des Parameters *PCS in das Register EDI
!PUSH Edi
!.loop:
Delay(1)
!MOV Esi,1
!XCHG [Edi],Esi ;Wir lesen den alten Wert aus und schreiben als neuen 1 rein!
!CMP Esi,0 ;Alter Wert war null, d.h. die vorige CS ist fertig
!JNE .loop ;Durch das XCHG haben wir automatisch wieder 1 im Speicher
EndProcedure
Procedure Pure_LeaveCS(*PCS.Pure_CS)
*PCS\Cnt=0
EndProcedure
EnableDebugger
;- Definitionen
#minPort = $0000
#maxPort = $FFFF
#ChecksAtSameTime = 1000
Global AktuellerPort: AktuellerPort=#minPort
Global CS.Pure_CS : Pure_InitCS(CS)
Global ThreadCount : ThreadCount = 0
NewList OpenPorts.l()
;- Thread ScanPorts
DisableDebugger
Procedure ScanPorts(OhneFunktion.l)
Repeat
;Jeder Thread zieht eine Nummer zum Überprüfen!
;Der Code hier darf nicht mehrfach gleichzeichtig ausgeführt werden!
;Dies wird durch die CriticalSection gewährleistet
Pure_EnterCS(CS)
If AktuellerPort > #maxPort
ThreadCount-1
Pure_LeaveCS(CS) ;<- WICHTIG! Sonst warten die anderen Threads unendlich
ProcedureReturn 1
EndIf
LokalerPort = AktuellerPort
AktuellerPort+1
Pure_LeaveCS(CS)
;=> Jeder Thread hat eine einmalige Nummer = Port!
;ACHTUNG: OpenNetworkConnection ist hier nur Threadsicher, da ein
;konstanter String verwendet wird!
check=OpenNetworkConnection("localhost",LokalerPort)
If check
CloseNetworkConnection(check)
;=> Der Port ist offen => LL eintragen
Pure_EnterCS(CS)
AddElement(OpenPorts())
OpenPorts()=LokalerPort
Pure_LeaveCS(CS)
EndIf
ForEver
EndProcedure
EnableDebugger
;- Main
InitNetwork()
;1. Starte alle Threads! Es kann passieren, dass das Starten manchmal fehlschlägt,
; daher müssen wir mitzählen
For I=1 To #ChecksAtSameTime
If CreateThread(@ScanPorts(),0)
Pure_EnterCS(CS)
ThreadCount+1
Pure_LeaveCS(CS)
EndIf
Next I
;2. Die Hauptschleife! Sie kann dazu genutzt werden den aktuellen Status
; anzuzeigen
Repeat
Delay(1000)
;Berechne den Status in Prozent und zeige ihn an
Pure_EnterCS(CS)
Cur.l=(AktuellerPort-#minPort)*100/(#maxPort-#minPort)
Debug Str(Cur)+"%"
Pure_LeaveCS(CS)
Until ThreadCount=0 ;=> Bis kein Thread mehr offen ist!
Debug "DONE!"
;3. Ergebnisse auswerten!
ForEach OpenPorts()
Debug OpenPorts()
Next
End
Mfg,
PureFan
EDIT: Ganz kleiner Rechtschreibfehler korrigiert, der jedoch keinen Einfluss auf die Funktionsweise hat
EDIT2: Eine weitere kleine Modifikation durchgeführt, die das ganze möglicherweise etwas stabiler macht.
Verfasst: 03.11.2005 22:29
von DataMiner
Wie gerne würde ich sagen: Das ist die Lösung!
Aber leider bleibt der Code einfach unmotiviert stehen.
Mal geht das Debug-Fenster auf und es werden die ersten Prozente angezeigt, mal bleibt er gleich hängen.
Sorry.
Verfasst: 03.11.2005 22:36
von PureFan
Ich habe den Quellcode natürlich vor dem Posten mehrmals getestet.. Sowohl unter PB 3.94 als auch 3.93 und kann mir den Fehler daher nicht erklären. Arbeitest du evt. mit geupdateten Libraries oder sonstigen Beta-Modifikationen?
Die einzige Idee die ich hätte, wäre folgendes: Den Debugger abschalten und ein kleines Consolen-Programm daraus bauen (einfach alles in die Console schreiben anstatt ins Debug-Output). Wenn der Verdacht besteht, dass es an der PB-Version liegt kann ich auch eine compilierte Version online stellen.
EDIT: Eine weitere Testmöglichkeit wäre die Anzahl der Threads zu reduzieren. Oder aber: Eine IP anstatt eines Domainnamen verwenden! (DNS Abfragen benötigen viel Zeit! Man würde daher den Fortschritt kaum bemerken!)
Verfasst: 04.11.2005 01:58
von Laurin
Bei mir funktioniert dein Code einwandfrei. Danke
Ich glaub' jetzt können wir Andre benachrichtigen. Das CodeArchiv wird sich freuen
Ich wußte, dass es sowas wie eine CriticalSection gibt. Dass man sie allerdings so benutzen muss, finde ich etwas befremdlich.
Verfasst: 04.11.2005 12:12
von hardfalcon
@Dataminer: der Code funzt einwandfrei, aber du musst ihn erstmal 1-2 Minuten werkeln lassen, bevor er beginnt, sich per Debug zu "äussern"...
@PureFan: Geil-o-mat, das is ein WIRKLICH guter Code!
//EDIT:
Laurin hat geschrieben:Beim Fahren gefürchtet,
von Frauen verehrt,
am Glase der Beste,
sein Körper begehrt,
politisch gebildet,
der Schw*** wie ein Bein,
das kann nur ICH sein!
Kein Wunder, dass du beim Fahren gefürchtet bist... Hast ja für jedes der 3 Pedale ein Bein... Und mit 3 Beinen fährt es sich bestimmt besser als mit 2...

Verfasst: 04.11.2005 15:15
von Laurin
hardfalcon hat geschrieben:Laurin hat geschrieben:Beim Fahren gefürchtet,
von Frauen verehrt,
am Glase der Beste,
sein Körper begehrt,
politisch gebildet,
der Schw*** wie ein Bein,
das kann nur ICH sein!
Kein Wunder, dass du beim Fahren gefürchtet bist... Hast ja für jedes der 3 Pedale ein Bein... Und mit 3 Beinen fährt es sich bestimmt besser als mit 2...

Hehe, gewußt wie, ne?
Ich glaube, das eine Wort muss ich komplett in Sterne setzen, sonst gibt es vielleicht wieder sowas wie bei RTFM.
Verfasst: 05.11.2005 02:48
von Andre
@PureFan / Laurin: Code ist schon fürs Archiv vorgemerkt.
