Script verursacht hohe CPU Last mit TCP Listen

  • Hallo Leute,

    ich hab folgendes Problem, ich möchte ein kleines Tool programmieren womit ich einen PC neustarten kann.
    Dafür hab ich mir gedacht ich hör permament über TCP Listen einen Prot ab. Wenn hier der Richtige Wert empfangen wird,
    wird der PC neugestartet. Mein Problem ist jetzt, das die CPU Last fast 100% berägt.

    Die Frage jetzt was mache ich falsch? Wie kann ich mein script CPU freundlich gestalten.Ich habs schon mit sleep in der Schleife probiert.
    Leider wirkt sich das auf das Script aus.GUI ist nicht mehr schliessbar und Passwort wird nicht mehr verschlüsselt in der Ini abgelegt.

    Hier das Angangsgerüst dieser wüsten Idee, bin nach Stundenlangen suchen und experimentieren jetzt total in ein Loch gefahren.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Include <String.au3> ;Verschlüsselung einbinden

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

    #Region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\waidler\Desktop\Steuerserver\Form1.kxf
    $Form1 = GUICreate("Fernsteuerung für Shutdown", 275, 197, 192, 124)
    $Label1 = GUICtrlCreateLabel("Eingabe Remotepasswort", 64, 64, 147, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button1 = GUICtrlCreateButton("Passwort Speichern", 64, 120, 115, 25, $WS_GROUP)
    $Input1 = GUICtrlCreateInput("Input1", 64, 88, 121, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
    $Label2 = GUICtrlCreateLabel("Remote Server V1.0", 40, 24, 191, 28)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;Passwort für die Verschlüsselung
    Dim $cryptopasswort = "l23jk452jk3ös"
    ;Dim $pwinstring = "38E65A5B8812B2536CD5E16990C332022B93366EDDB65A38C226AD2B0F5CC91D"

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

    While 1

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

    TCPStartup ()
    $sv_Ip = TCPNameToIP ( "localhost" )
    $incoming_Socket = TCPListen ($sv_Ip, 333, 1000)
    TCPAccept ($incoming_Socket)
    $pwinstring = TCPRecv ( $incoming_Socket, 4096)
    $pwstring = IniRead (@ScriptDir & "\Passwort.ini", "Passwort", "var", "")
    If $pwinstring= $pwstring Then
    TCPSend ($incoming_Socket, "OK")
    EndIf
    TCPShutdown ()
    IF $pwinstring<> $pwstring Then
    TCPSend ($incoming_Socket, "Falsches Passwort")
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pwstring = _StringEncrypt(1, GUICtrlRead ($Input1), $cryptopasswort, 3)
    IniWrite (@ScriptDir & "\Passwort.ini", "Passwort", "var", $pwstring )
    Case $Form1
    Case $Label1
    EndSwitch
    WEnd

    [/autoit]

    Für jede Lösung im Voraus Dankbar

    MfG


    Waidler

    Einmal editiert, zuletzt von waidler (1. April 2010 um 00:29)

  • Und das TCPStartup() kann auch außerhalb der While 1... WEnd Schleife sein. Genauso das TCPShutdown() .

  • Ich hatte einen Sleep schon nach Endswitch eingefügt und getestet gehabt. (500ms). Sobald ich das mache, lässt sich die GUI erst nach permanenten
    drücken schliessen, bzw das neue Passwort wird auch erst nach mehrmaligen drücken geschrieben. Ich geh mal davon aus damit man keinen Datenempfang versäumt muss die sleep Time mindest genau so groß sein wie die Zeit in TCP Listen.In meinem Fall 1000ms

    Aber mit dem TCPStartup () usw. is schon mal ein guter Tipp, jetzt sinds nur noch knapp 50%CPU verbrauch

    Einmal editiert, zuletzt von waidler (1. April 2010 um 00:59)

  • verarbeite alles doch nur wenn du daten bekommst
    sollte so noch genauso funktionieren.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <String.au3> ;Verschlüsselung einbinden
    TCPStartup()
    $sv_Ip = TCPNameToIP("localhost")

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

    #region ### START Koda GUI section ### Form=C:\Dokumente und Einstellungen\waidler\Desktop\Steuerserver\Form1.kxf
    $Form1 = GUICreate("Fernsteuerung für Shutdown", 275, 197, 192, 124)
    $Label1 = GUICtrlCreateLabel("Eingabe Remotepasswort", 64, 64, 147, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button1 = GUICtrlCreateButton("Passwort Speichern", 64, 120, 115, 25, $WS_GROUP)
    $Input1 = GUICtrlCreateInput("Input1", 64, 88, 121, 21, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL))
    $Label2 = GUICtrlCreateLabel("Remote Server V1.0", 40, 24, 191, 28)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    ;Passwort für die Verschlüsselung
    Dim $cryptopasswort = "l23jk452jk3ös"
    ;Dim $pwinstring = "38E65A5B8812B2536CD5E16990C332022B93366EDDB65A38C226AD2B0F5CC91D"

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

    While 1
    $incoming_Socket = TCPListen($sv_Ip, 333, 1000)
    If Not @error Then
    TCPAccept($incoming_Socket)
    $pwinstring = TCPRecv($incoming_Socket, 4096)
    $pwstring = IniRead(@ScriptDir & "\Passwort.ini", "Passwort", "var", "")
    If $pwinstring = $pwstring Then
    TCPSend($incoming_Socket, "OK")
    Else ; WEnn es nicht gleich ist (geht doch mit else viel leichter ^^ )
    TCPSend($incoming_Socket, "Falsches Passwort")
    EndIf
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $Button1
    $pwstring = _StringEncrypt(1, GUICtrlRead($Input1), $cryptopasswort, 3)
    IniWrite(@ScriptDir & "\Passwort.ini", "Passwort", "var", $pwstring)
    Case $Form1
    Case $Label1
    EndSwitch
    WEnd

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

    TCPShutdown()

    [/autoit]

    ich würde sowas im OnEventMode scripten. geht viel schöner, aber das ist bekanntermaßen geschmackssache

  • Danke, also die CPU Last is jetzt wirklich weg, Also sehr gut geholfen. Jetzt muss ich nur mal wegen dem Verständnis nachfragen, damit ich auf sowas auch mal
    selber kommen kann. Also die Zeit in TCP Listen ist die Zeit die er für das "abhören" bereitstellt bis er wieder vom script neu ausgelöst wird. Deshalb läuft das script
    aber auch weiter, den es startet erst den Vergleich, wenn ich über TCP connect (also in dem zukünftigen Client) diesen anspreche. Später kann ich ja noch versuchen eine Art IP-Sperre einzubauen. Dreimal connecten und dann ist die IP für die nächsten 24h gesperrt. (Kaum is ein Port ofen, dann sind Script Kiddis am Arbeiten und Brutforcen sollts man nicht können.)
    Für die Rückgabe für der Else Methode .... muss ich mal selber am Schlawittel packen. Hät ich selber darauf kommen können. Aber bisher hab ich in meinen Scripten kein Else verwedet. (Bisher nur mein Clanpack).

    MfG

    Waidler