Netzwerktraffic messen, die Zweite!

  • Hi Ihr Cracks! :)

    Mithilfe der Vorschläge von Mega und Chrisatack (an dieser Stelle herzlichen Dank) hab ich es nun hingekriegt, mir meinen Trafficmeter so zu bauen, wie ich ihn haben will ...
    Das Tool zeigt Up- und Downloadrate an und beendet ein beliebiges Programm, wenn der Uploadwert für eine definierte Zeit unter einem definierten Schwellenwert lag.
    Soweit, so gut...

    AAAABER:

    Ich habe das Tool immer nur mit kurzen Zeiten getestet. Mal nur 10 Sekunden, mal eine Minute.
    In der Realität soll aber erst etwas passieren, wenn der Upload eine halbe Stunde lang unter dem Schwellenwert lag.

    Nach ca. 20 Minuten (hab ich jetzt nicht genau nachgemessen) bricht das Programm ab mit der Meldung, dass nicht genug freie Ressourcen zu Verfügung stehen. :(
    Daraufhin hab ich mir das Ding mal im Taskmanager angeschaut. Und siehe da: die Auslastung des virtuellen Speichers dieses Tools steigt etwa alle 20 Sekunden um 4kb an.
    Das ist natürlich nicht viel, aber ich denke mal, dass es daran liegt, oder?

    Ich versteh halt irgendwie nicht, warum die Auslastung permanent ansteigt. Gibt es da bei AutoIT ne Möglichkeit, Speicher wieder freizugeben?

    Hier nochmal der Code für Euch...ich hoffe, Ihr kriegt vielleicht was raus...

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <Constants.au3>
    #include <array.au3>
    #include <string.au3>

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $begin1 = TimerInit(); Startpunkt Zeitmessung für Netstat
    $start = TimerInit() ; Startpunkt Zeitmessung für Tracking

    $NetGUI = GUICreate("Tracking Guard v1.0", 294, 100, 197, 120, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    [/autoit] [autoit][/autoit] [autoit]

    $Up = GUICtrlCreateLabel("SpeedUp", 8, 50, 100, 20, BitOR($SS_CENTER,$SS_SUNKEN,$WS_GROUP))
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")

    [/autoit] [autoit][/autoit] [autoit]

    $Down = GUICtrlCreateLabel("SpeedDown", 176, 50, 100, 20, BitOR($SS_CENTER,$SS_SUNKEN,$WS_GROUP))
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("Upload", 31, 20, 55, 20, $WS_GROUP)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("Download", 190, 20, 70, 20, $WS_GROUP)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")

    [/autoit] [autoit][/autoit] [autoit]

    $Progress1 = GUICtrlCreateProgress(8, 80, 100, 9)
    $Progress2 = GUICtrlCreateProgress(176, 80, 100, 9)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    GUISetOnEvent(-3, "_exit")

    ;Initialisieren
    $UpStr = 0
    $DownStr = 0
    $time = 0
    $UpStr_alt = 0
    $DownStr_alt = 0


    _netstat($UpStr, $DownStr); Up,Down das erste mal lesen um Verschiebungspunkte zu suchen
    $Xup = $UpStr ;Startpunkt setzen
    $Xdown = $DownStr


    While 1

    Sleep (500)

    _netstat($UpStr, $DownStr)

    ;Differenzen berechnen
    $UpStr = $UpStr - $Xup
    $DownStr = $DownStr - $Xdown

    $Up_speed = $UpStr - $UpStr_alt
    $Down_speed = $DownStr - $DownStr_alt


    ;Zeitliche Differenz berechnen und Zeitmessung Neu starten (Netstat)
    $diff = TimerDiff($begin1)
    $begin1 = TimerInit()

    ;Zeitversatz abziehen oder draufrechnen (WICHTIG!)
    $Up_speed = $Up_speed/($diff/1000)
    $Down_speed = $Down_speed/($diff/1000)

    $Up_speed = Round(($Up_speed*8)/1024,2) ; *8 für Byte zu bit /1024 für in kbit
    $Down_speed = Round(($Down_speed*8)/1024,2)

    $Up_speed_pro = $Up_speed*0.5
    $Down_speed_pro = $Down_speed*0.05 ; 0,05 0.00625

    GUICtrlSetData ($Progress1,$Up_speed_pro) ;Prozessbalken setzen
    GUICtrlSetData ($Progress2,$Down_speed_pro)

    GUICtrlSetData ($Up,$Up_speed&' kbit/s') ;Upload Daten setzen
    GUICtrlSetData ($Down,$Down_speed&' kbit/s')


    ;Alte Werte Speichern
    $UpStr_alt = $UpStr
    $DownStr_alt = $DownStr


    ;Startpunkt auf 0 setzen, wenn getrackt wird
    If $Up_speed > '80' Then
    $start = TimerInit()
    EndIf

    ;Zeitliche Differenz berechnen (Tracking)
    $ende = TimerDiff($start)

    ;Tracking beenden, wenn seit >= 30min nicht getrackt wurde
    If WinExists("DTrack") And $ende >= '1800000' And $Up_speed < '60' Then
    WinActivate("DTrack")
    MouseMove(20, 50, 1)
    MouseClick("left")
    Send("!{F4}")
    MsgBox(0, "Tracking beendet", "Es gab seit über 30 Minuten keine Tracking-Aktivität." & @CRLF & "Das Tracking wurde beendet")
    Exit
    EndIf

    WEnd

    ;netstat -e ausführen und wichtige Werte auslesen
    Func _netstat(ByRef $UpStr, ByRef $DownStr)
    $NetStat = Run(@ComSpec & " /c netstat -e", @SystemDir, @SW_HIDE, 2)
    $LineDos = StdoutRead($NetStat, 400)

    If StringInStr($LineDos,'Bytes') = True Then
    $Line = _StringBetween ($LineDos,'Bytes','Unicastpakete')
    $Line = StringStripWS($Line[0], 7)
    $Lines = StringSplit($Line, " ")
    $UpStr = $Lines[2]
    $DownStr = $Lines[1]
    EndIf

    EndFunc ;==>_netstat

    ;Func _Reset(ByRef $TUp, ByRef $TDwn)
    ; _netstat($UpStr,$DownStr)
    ; $Tup = $UpStr
    ; $Tdwn = $DownStr
    ;EndFunc

    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]

    ACHTUNG:Ich hab oben bei den #includes die zu ladenden Dateien in runde Klammern gesetzt, weil die Code-Funktion die spitzen Klammern nicht annimmt.

    Ich dank Euch.

    Viele Grüße,
    Trash_Maxx

    bernd670: Runde gegen spitze Klammern ausgetauscht!

    Einmal editiert, zuletzt von bernd670 (3. Dezember 2007 um 14:54)

  • Hab mal etwas herumprobiert und es liegt meiner meinung nach am stdout stream

    hab dann bemerkt, dass bei meinen scripts das gleiche phänomen auftritt und das prog zusehends mehr und mehr speicher benötigt, wenn man den stdout liest. (getestet mit lame.exe und ftp.exe) allerdings habe ich meine progs noch nie lange genug laufen lassen sodaß es zu einem problem geworden wäre...

    könnte das ein bug sein?!?

  • Das liegt daran, dass man den Stream "leerlesen" muss, damit er geschlossen wird. Sonst wird jedesmal ein neuer geöffnet:

    Spoiler anzeigen
    [autoit]

    ;netstat -e ausführen und wichtige Werte auslesen
    Func _netstat(ByRef $UpStr, ByRef $DownStr)
    $NetStat = Run(@ComSpec & " /c netstat -e", @SystemDir, @SW_HIDE, 2)
    $LineDos = StdoutRead($NetStat, 400)

    ;BEGIN Stdout leeren, um zu schließen
    While @error = 0
    $temp = StdoutRead($NetStat)
    WEnd
    ;END Stdout leeren

    If StringInStr($LineDos,'Bytes') = True Then
    $Line = _StringBetween ($LineDos,'Bytes','Unicastpakete')
    $Line = StringStripWS($Line[0], 7)
    $Lines = StringSplit($Line, " ")
    $UpStr = $Lines[2]
    $DownStr = $Lines[1]
    EndIf

    EndFunc ;==>_netstat

    [/autoit]


    Quelle: http://www.autoitscript.com/forum/lofivers…php?t48071.html

  • Das liegt daran, dass man den Stream "leerlesen" muss, damit er geschlossen wird. Sonst wird jedesmal ein neuer geöffnet:

    das dachte ich zunächst auch und ich hab das auch ausprobiert, jedoch das problem wurde dadurch nicht gelöst! zumindest bei mir...

    startet man cmd.exe und ruft "netstat -e" mehrmals auf, wird auch der cmd.exe-speicher regelmässig um 4kb größer...allerdings nur bis zu einer gewissen grenze...

  • Danke für die Antworten!!
    Werde ich heute mal ausprobieren.
    Falls sonst jemand noch Tipps hat, bitte melden :)

  • Hi!

    @progandy: leider hat Dein Tipp nicht funktioniert. Der Speicherbedarf geht nach wie vor konstant hoch. Schade! :(
    Aber die Richtung war bestimmt schon richtig, oder?


  • startet man cmd.exe und ruft "netstat -e" mehrmals auf, wird auch der cmd.exe-speicher regelmässig um 4kb größer...allerdings nur bis zu einer gewissen grenze...

    hmmm...das ist bei mir nicht so.
    wenn ich cmd ausführe, braucht die bei mir im (virtuellen) Speicher 2196kb.
    führe ich dann netstat -e einmal aus, springt die Auslastung auf 2396kb, also 200 kb mehr...
    führe ich es dann noch einmal aus, werden es 4 kb mehr und danach passiert nix mehr, egal, wie oft ich netstat -e ausführe...
    das is doch wirklich strange, oder?

  • Weiß denn keiner ne Lösung für dieses Problem???
    Das darf doch jetzt nicht alles umsonst gewesen sein! :(

    Ich hoffe, irgendjemand rettet mich noch!
    Merci!

  • edit: Hä sorry bin verpeilt
    edit2:

    [autoit]


    DllCall("Psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)

    [/autoit]

    leert virtuellen speicher.

    Vielleicht hilft das :)
    in die While damit

    mfG qon

  • [autoit]


    DllCall("Psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)

    [/autoit]

    leert virtuellen speicher.

    Hmm...schade, scheint leider irgendwie nicht zu klappen. Virtueller Speicher geht immer noch hoch und die Fehlermeldung kommt auch leider immer noch.
    Danke für den Tipp, aber das wars leider nicht! :( :( :(

    Was kann ich nur machen????

    Der verzweifelte Trashmaxx

  • starte netstat nicht mit jeder schleife erneut, sondern insgesammt nur 1 mal mit der intervall-abfrage:

    netstat -e 1
    (liefert alle 1 sekunden eine ausgabe)

    hab das mal kurz angetestet, hatte jedoch probleme den stdout korrekt auszulesen und hab jetzt leider keine zeit mehr zum weitertüffteln :(

    vielleicht hilft das ja...

    lgE

  • Hey.
    An sich keine schlechte Idee, kannte ich noch gar nicht, die Funktion.
    Allerdings ändern sich bei mir auf die Art nur jedes 10te mal oder so die Stat-Werte.
    Wenn ich hingegen den Befehl manuell jede Sekunde ausführe, ändern sich die Werte jedes mal.
    Da stimmt doch dann auch was nicht, oder?

  • Hi!

    Ich hab jetzt in einem anderen Forum den entscheidenden Hinweis gekriegt:

    ans Ende der _netstat() Funktion einfach

    [autoit]


    If ProcessExists($NetStat) Then
    ConsoleWrite("closing cmd"&@LF)
    ProcessClose($NetStat)
    EndIf

    [/autoit]

    und schon funzt alles. :)

    Die Speicherauslastung steigt zwar weiterhin stetig an, aber das Programm wird nicht mehr unerwartet beendet.
    Dieses Thema ist somit abgeschlossen.

    Danke nochmal Euch allen!