1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • Trolled by variable?!

    • misterspeed
    • 23. September 2012 um 23:59
    Zitat von Zattoo

    doch es ist doch ein beispielscript dabei...? :D

    Willst mich verarschen? Ich hab geschrieben ein Script in dem der Fehler noch auftritt. Was soll ich mit deinem oder viel mehr meinem mit zusätzlichn includes vollgeklatschten funktionierenden Script? Wie soll jemand deinen Fehler finden wenn du kein fehlerhaftes Script bereitstellst?

    Zitat

    4. Poste die Zeilen der Consolen Ausgabe der Füllfunktion.
    5. Poste das komplette Script oder zumindestens eine lauffähige Version in der das Problem noch auftritt.

    Zitat von Zattoo

    4. fällt ja auch wegen 2 weg

    Punkt 4 hat rein garnichts mit Punkt 2 und 3 zu tun. Du hast weiter oben die Funktion gepostet in der das Listview die Daten bekommt. Dort ist auch ein consolewrite(). Genau diese Daten will ich sehen, damit ein Fehler beim Dateninput ausgeschlossen werden kann:

    [autoit]


    Func _ReadFiles($SearchPath, $SearchString)
    $FileList = _FileListToArray($SearchPath, "*", 1)
    If Not @error Then
    For $i = 1 To $FileList[0]
    $ReadedFile = FileRead($SearchPath & $FileList[$i])
    If StringInStr($ReadedFile, $SearchString) Then
    ConsoleWrite($SearchString & "|" & $SearchPath & $FileList[$i] & @CRLF)
    GUICtrlCreateListViewItem($SearchString & "|" & $SearchPath & $FileList[$i], $FileListView)
    EndIf
    Next
    EndIf
    EndFunc

    [/autoit]

    Punkt 5 ist dann jedenfalls deine letzte Möglichkeit hier eine Lösung zufinden. Ansonsten such den Fehler selbst.

  • Trolled by variable?!

    • misterspeed
    • 23. September 2012 um 11:39

    Letzter Versuch dir zu helfen:


    1. Prüfe ob du die Variable des Listviews mehrfach verwendest und dir dadurch die control id überschreibst.
    2. Sofern das Listview nicht global erstellt wird sondern in einer Funktion achte darauf dass die variable global deklariert ist oder an die Füllfunktion übergeben wird.
    3. Wenn du die funktion in der das Listview erstellt wird mehrfach aufrufst hast du multiple listviews die sich überlappen... schlecht!
    4. Poste die Zeilen der Consolen Ausgabe der Füllfunktion.
    5. Poste das komplette Script oder zumindestens eine lauffähige Version in der das Problem noch auftritt.

  • Trolled by variable?!

    • misterspeed
    • 22. September 2012 um 17:39

    Gewöhn dir mal an Testscripte in denen der Fehler reproduzierbar ist zu posten. Ich glaube keiner hier hat Lust jedesmal eine GUI zu basteln nur um dir zu helfen. Davon ab ist es natürlich möglich der Funktion variable Parameter mitzugeben. Ich nehme an dein Fehler entsteht bei der Erstellung des Listviews, vermutlich hast du keine oder eine abweichende Spaltenzahl vorgegeben.


    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <WindowsConstants.au3>
    #include <file.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    $List1 = GUICtrlCreateListView("Spalte1|Spalte2", 120, 88, 425, 253)

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

    ;GUICtrlCreateListViewItem("wert1|wert2",$List1)

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

    $aDirContent=_FileListToArray(@ScriptDir)

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

    For $i=1 to $aDirContent[0]
    GUICtrlCreateListViewItem(@ScriptDir & "|" & $aDirContent[$i],$List1)
    next

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

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Root + TCPServer + _MemoryRead

    • misterspeed
    • 20. September 2012 um 14:22

    Vielleicht auch ein 32/64 bit Problem? Keine Ahnung ob diese memory UDF da Probleme macht. Könnte mir aber gut vorstellen, dass es einen unterschied macht ob man die Speicherbereiche einer 32bit oder 64bit Anwendung ausliest.

  • mstsc / rdp tool

    • misterspeed
    • 19. September 2012 um 15:46

    Unter der Annahme, dass du alle RDP Dateien am selben Ort speicherst:

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <file.au3>
    #include <ComboConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GUIConstants.au3>

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

    $rdpDirectory = @ScriptDir & "\"
    $aServerFiles = _FileListToArray($rdpDirectory,"*.rdp",1)
    _ArrayDisplay($aServerFiles) ; zum debugen...

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

    $Form1 = GUICreate("RDP Session", 222, 116, 212, 116)
    $Combo1 = GUICtrlCreateCombo("", 24, 24, 145, 25)
    if $aServerFiles <> 0 Then
    $sData = ""
    For $i=1 To $aServerFiles[0]
    $sData &= $aServerFiles[$i] & "|"
    Next
    GUICtrlSetData($Combo1,StringTrimRight($sData,1),$aServerFiles[1])
    EndIf
    $Button1 = GUICtrlCreateButton("Start", 24, 72, 75, 25, 0)
    $Button2 = GUICtrlCreateButton("Cancel", 120, 72, 75, 25, 0)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Run ("%SystemRoot%\system32\mstsc.exe /v:" & $rdpDirectory & GUICtrlRead ($Combo1)) ; hier solltest du denke ich noch Pfade in Anführungszeichen setzen, da es sonst bei Leerzeichen im Pfad probs geben wird... '"c:\...."'
    Exit
    Case $Button2
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Möglichst faules speichern von Einstellungen

    • misterspeed
    • 18. September 2012 um 10:50

    Naja ich würde nicht die Controlid zur Zuordnung verwenden, denn wenn du die GUI später mal erweiterst stimmen deine IDs nicht mehr und das Auslesen der ini würde ggf. falsche Felder befüllen.
    Davon ab wäre ein manuelles Editieren der ini Datei dadurch auch nicht gut möglich.

    Alternativ zu einer ini Datei ist vielleicht auch der Einsatz einer CSV Datei sinnvoll oder bequemer. Vielleicht kannst du ja etwas mehr vom Script posten, insbesondere die GUI. So kann man schlecht eine Aussage treffen wie man das am besten umsetzt.

  • Root + TCPServer + _MemoryRead

    • misterspeed
    • 16. September 2012 um 17:27

    Dann hilft wohl nur gescheites debugging. Ich gehe davon aus, dass die Funktionen _MemoryOpen() und _MemoryRead() durchaus über Errorcodes und Fehlerrückgabewerte verfügen, die man auswerten könnte, dazu eben mal einen Blick in die UDF werfen. Der erste Schritt wäre also dein Script so umzubauen, dass die Teilergebnisse nicht sofort weiterverarbeitet sondern erstmal zu Debugzwecken in Logdateien inklusive möglicher Fehlercodes ausgegeben werden. Auch verwendest du anscheinend die Ergebnisse von iniread im Funktionsaufruf. Um Fehler auszuschliessen sollte der INI Inhalt ebenfalls zuerst geprüft werden.

  • Root + TCPServer + _MemoryRead

    • misterspeed
    • 16. September 2012 um 15:19

    Und du bist dir sicher, dass das Autoit Script überhaupt gestartet wird? Bastel doch mal ein Testscript, das nur eine Datei @scriptdir anlegt und sich dann wieder beendet. Das Ergebnis kannste dann ja zumindestens per FTP prüfen.
    Ohne vollen Serverzugang stelle ich mir jedenfalls den Betrieb eines eigenen TCP Servers problematisch vor, Zugang zur Windows Firewall haste so ja z.B. auch selbst keinen und musst dich auf die Aussagen des Hosters verlassen. Da der Hoster anscheinend ja auch andere Kunden mit diesem Server versorgt bezweifle ich auch, dass er dir irgendwelche weitergehenden Rechte auf der Maschine einräumen wird oder überhaupt mit der Ausführung von Fremdcode auf seinem Server einverstanden ist. Letztlich wäre das ja ein enormes Sicherheitsrisiko für den Hoster und die anderen Kunden auf dem Server.

  • Root + TCPServer + _MemoryRead

    • misterspeed
    • 16. September 2012 um 14:55

    Keine Ahnung wie das bei Game Servern so läuft... hast du vollen Remotedesktopzugang zum Server? Wenn ja verfügst du überhaupt über Administratorrechte? Läuft der Gameserver ansich über deinen eigenen Benutzeraccount des physikalischen Servers oder wird der auf einem von dir nicht direkt zugreifbaren Account ausgeführt? Ob die Memory UDF die du da verwendest in der Lage ist auch Speicherbereiche von Programmen auszulesen, die auf anderen Benutzeraccounts laufen weiß ich nicht, ggf. liegt ja auch da das Problem.

  • Root + TCPServer + _MemoryRead

    • misterspeed
    • 16. September 2012 um 11:34

    Keine Ahnung welches OS auf deinem Server läuft, aber Serverbetriebssysteme haben normalerweise die "Datenausführungsverhinderung" aktiviert. Könnte mir durchaus vorstellen, dass das bei Zugriffen auf Speicherbereiche anderer Anwendungen zu Problemen führen kann. Hatte jedenfalls selbst schon Anwendungen, die auf Windows 7 einwandfrei liefen, auf Windows 2008 R2 allerdings erst nach Ausnahme in der Datenausführungsverhinderung.

  • Taskbar auf ein Icon / Fenster reduzieren

    • misterspeed
    • 16. September 2012 um 10:55

    Oder so?

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $parentForm = GUICreate("Mein Programm", 1000, 100, 200, 200)
    $Form1 = GUICreate("Form1", 280, 300, 200, 350,$WS_SYSMENU,-1,$parentForm)
    $Form2 = GUICreate("Form2", 380, 300, 515, 350,$WS_SYSMENU,-1,$parentForm)
    $Form3 = GUICreate("Form3", 280, 300, 930, 350,$WS_SYSMENU,-1,$parentForm)
    $Form4 = GUICreate("Form4", 1000, 200, 200, 700,$WS_SYSMENU,-1,$parentForm)

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

    GUISetState(@SW_SHOW,$parentForm)
    GUISetState(@SW_SHOW,$Form1)
    GUISetState(@SW_SHOW,$Form2)
    GUISetState(@SW_SHOW,$Form3)
    GUISetState(@SW_SHOW,$Form4)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]
  • Alle Fenster schließen

    • misterspeed
    • 15. September 2012 um 14:52

    Warum arbeitest du mit 11 offenen Fenstern? Wäre es nicht sinnvoller 1 Fenster mit 11 Tabs zu verwenden?

    Interessant wäre außerdem wie du die Fenster erzeugst. Startest du jedesmal eine neue Verbindung mit Mozrepl? Wenn ja dürfte klar sein, warum maximal das letzte Fenster geschlossen werden kann. Hab aber ehrlich gesagt noch nie mit multiplen Fenstern und der ff.au3 gearbeitet, müsste ich mir auch erst ansehn wo es da zu Problemen kommen kann.

  • Zugriff auf Array

    • misterspeed
    • 31. August 2012 um 19:31

    Wenn $i wirklich verändert werden soll, was afaik nur in dem einen Fall der so nicht funktioniert eintreten würde kann man das noch mithilfe von assign lösen:

    [autoit]


    #include<array.au3>

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

    Dim $aArray[5] = [1,7,12,55,89]

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

    ;_arraydisplay($aArray)

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

    $i = 1
    ConsoleWrite($aArray[2] & @CRLF); sollte 12 ergeben
    ConsoleWrite($aArray[1 + 1] & @CRLF); sollte 12 ergeben
    ConsoleWrite($aArray[Assign("i", $i + 2)*$i] & @CRLF); $i sollte nun 3 sein, die abfrage also 55 ergeben
    ConsoleWrite($aArray[$i + 1] & @CRLF); sollte 89 ergeben, da i mittlerweile 3 ist und nochmals mit 1 addiert wird, $i ist unverändert 3

    [/autoit]

    Aber wirklich toll ist so ein code nicht, würde davon abraten sowas zu verwenden...

  • Error: Subscript used with non-Array variable

    • misterspeed
    • 29. August 2012 um 19:17

    Wie von TheLuBu bereits richtig erkannt gehst du fahrlässig mit Funktionen um die normalerweise zwar Arrays zurückgeben, im Fehlerfall allerdings nicht. Prüft man die Ergebnisse der Funktion nicht und verwendet die Ergebnis Variable blind weiter, als ob sie ein Array wäre kann es zum beschriebenen Programmabsturz kommen. Deswegen prüft man grundsätzlich auf die in der Funktion definierten Fehlerrückgabewerte, insbesondere wenn das Ergebnis weiterverwendet werden soll. Reagieren kann man hier dann auf diversen Arten. Da du vermutlich wissen willst warum und wann eine Teilfunktion einen Fehler zurückgibt solltest du die Makros @error und je nach Funktion auch @extended nutzen, welche Debug Möglichkeiten bestehen kannst du den betreffenden Hilfeeinträgen entnehmen. Wichtig sind jedenfalls entpsrechende if Bedingungen oder Schleifenabbrüche damit es im Fehlerfall nicht zum Absturz kommt. Außerdem Wichtig wäre es die Fehler auszugeben und möglichst viele releavante Informationen zu speichern. In deinem Fall solltest du neben den Fehlercodes auch den aktuellen Schleifendurchgang und evtl vorhergegangene Variabelninhalte in eine Logdatei schreiben, damit du nachvollziehen kannst warum es zum Fehler kam.

  • TCP FileTransfer Performance

    • misterspeed
    • 26. August 2012 um 18:16

    Aus langeweile habe ich gestern mal wieder ein wenig mit Client Server Geschichten rumgespielt. Die Kommunikation zwischen Client und Server scheint soweit auch zu funktionieren, jedoch sollen nun auch größere Dateien (1GB) per TCP zwischen beiden übertragen werden.
    Dabei gibt es zwei Probleme in meinem Script.

    1. Die Dateigröße der übertragenen Datei weicht vom Original ab. Ich vermute das passiert, beim letzten eingelesenen Part der Datei, aber ich habe keine wirkliche Idee wie ich das beheben kann.

    2. Der Transfer ist verdammt langsam, was für einen Transfer übers Internet zwar noch akzeptabel wäre, aber solange ich client und server auf dem selben Computer betreibe sollten doch eigentlich deutlich höhere Transferraten möglich sein. Ich erreiche mit den aktuellen Scripten lediglich 4-5 MB/s, verzehnfache ich die Größe der Dateiparts im Server und den zugehörigen Lesepuffer im Client, dann erreiche ich immerhin 11 mb/s, was im Vergleich zum normalen Kopieren weniger als ein zehntel der maximalen Geschwindigkeit ist. Ist die Größe der Parts jedoch zu hoch reagiert der Server nicht mehr richtig, weil er relativ lange mit dem Senden eines einzelnen Parts beschäftigt ist, das muss auf jedenfall vermieden werden. Auch sollen später langsame Clients (Internet) nicht ausgebremst werden, weil sie Möglicherweise mehrere Sekunden für einen Dateipart benötigen, bevor sie wieder andere Dinge wie GUI cmds abarbeiten können. Die Partgröße zu erhöhen fällt also schonmal weg um die Performance zu verbessern.


    Vielleicht hat ja jemand von euch Ideen wie man die Performance erhöhen könnte und den Fehler bei der Übertragung behebt.


    Anmerkungen zu den Scripten:


    Der Server sollte per Scite ausgeführt werden um alle Debug Meldungen aus der Console lesen zu können.
    Der Client sollte kompiliert werden.

    Um einen Dateitransfer zu starten muss zuerst der Server, dann der Client gestartet werden, im client dann den connect Button nutzen und im Anschluss den getfile Button.
    Vor dem ersten Testlauf muss im Server noch die globale Variable $testfile angepasst werden, hier sollte eine Datei mit mindestens 500 MB verwendet werden.

    Client
    [autoit]


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

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

    TCPStartUp()

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

    Global $IP = "127.0.0.1"
    Global $socket = -1
    Global $datasocket = -1
    Global $peerAliveTimer = TimerInit()
    Global $maxlen = 512000 ; tcprecv buffer
    Global $delim = "$##$"
    Global $alivecounter = 0
    Global $filesize = -1
    Global $retrievedData = 0
    Global $filename = "unknown.dat"
    Global $filehandle = -1

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

    #Region ### START Koda GUI section ### Form=
    $guimain = GUICreate("Client Window", 444, 385, 192, 124)
    $editconsole = GUICtrlCreateEdit("", 24, 104, 369, 249)
    $btngetfile = GUICtrlCreateButton("getfile", 24, 0, 60, 24)
    $btnsend = GUICtrlCreateButton("send", 290, 30, 60, 40, $WS_GROUP)
    $btnconnect = GUICtrlCreateButton("connect", 370, 30, 60, 40, $WS_GROUP)
    $Inputmsg = GUICtrlCreateInput("", 24, 30, 250, 20)
    $inputNick = GUICtrlCreateInput("Nick", 24, 60, 250, 20)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    if $socket <> -1 Then
    $data = TCPRecv($socket,$maxlen)
    if $data <> "" Then
    $aTCPmsg=StringSplit($data,$delim,1)
    For $x=1 To $aTCPMsg[0]
    If $aTCPMsg[$x]="" Then ContinueLoop
    Switch $aTCPMsg[$x]
    Case "~!~server forced disconnect~!~"
    GUICtrlSetData($editConsole,"INFO received by server: " & "Sitzung vom Server beendet (kick)" & @CRLF & GUICtrlRead($editConsole))
    TCPCloseSocket($socket)
    $socket = -1
    GUICtrlSetState($btnconnect,$GUI_ENABLE)
    Case "~!~server shutdown~!~"
    GUICtrlSetData($editConsole,"INFO received by server: " & "Sitzung vom Server beendet (shutdown)" & @CRLF & GUICtrlRead($editConsole))
    TCPCloseSocket($socket)
    $socket = -1
    GUICtrlSetState($btnconnect,$GUI_ENABLE)
    Case "~!~Nick registered~!~"
    GUICtrlSetData($editConsole,"INFO received by server: " & "Nickname wurde vom Server registriert" & @CRLF & GUICtrlRead($editConsole))
    Case "~!~Nick changed~!~"
    GUICtrlSetData($editConsole,"INFO received by server: " & "Nickname wurde vom Server geändert" & @CRLF & GUICtrlRead($editConsole))
    Case Else
    GUICtrlSetData($editConsole,"MSG received by server: " & $aTCPMsg[$x] & @CRLF & GUICtrlRead($editConsole))
    EndSwitch
    Next
    EndIf

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

    If TimerDiff($peerAliveTimer) > 10000 Then
    $peerAliveTimer = TimerInit()
    $alivecounter+=1
    $alive = sendmessage($socket,"~!~alive~!~")
    ;WinSetTitle($guimain,"",$alivecounter)
    if $alive = 0 Then
    GUICtrlSetData($editConsole,"TCP Connection lost: " & $socket & @CRLF & GUICtrlRead($editConsole))
    TCPCloseSocket($socket)
    $socket = -1
    GUICtrlSetState($btnconnect,$GUI_ENABLE)
    EndIf
    EndIf
    EndIf

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

    if $datasocket <> -1 And $filehandle <> -1 Then
    $alive = sendmessage($datasocket,"~!~alive~!~")
    if $alive = 0 Then
    TCPCloseSocket($datasocket)
    FileClose($filehandle)
    $datasocket=-1
    $filehandle=-1
    Else
    $binarydata = TCPRecv($datasocket,1024000,1)
    FileWrite($filehandle,$binarydata)
    EndIf
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _terminateClient()
    Exit
    Case $btnsend
    if $socket = -1 Then
    MsgBox(0,"Client Fehler","Server not connected.")
    Else
    sendmessage($socket,GUICtrlRead($Inputmsg))
    GUICtrlSetData($editConsole,"Data send to server: " & GUICtrlRead($Inputmsg) & @CRLF & GUICtrlRead($editConsole))
    GUICtrlSetData($Inputmsg,"")
    EndIf
    Case $btnconnect
    if $socket = -1 Then
    $socket = TCPConnect( $IP, 5555)
    If $socket = -1 Then
    MsgBox(0,"Client-Fehler","Verbindung zum Server fehlgeschlagen")
    Else
    $peerAliveTimer=TimerInit()
    GUICtrlSetState($btnconnect,$GUI_DISABLE)
    sendmessage($socket,"~!~IDENT~!~" & guictrlread($inputNick))
    EndIf
    Else
    MsgBox(0,"Client Fehler","Already connected to server")
    EndIf
    Case $btngetfile
    $datasocket=TCPConnect($ip,5555)
    sendmessage($datasocket,"~!~getFile~!~")
    if Not FileExists(@ScriptDir & "\downloads") Then DirCreate(@ScriptDir & "\downloads")
    $filehandle = FileOpen(@ScriptDir & "\downloads\" & $filename,17)
    ;$filehandle = FileOpen("F:\" & $filename,17)
    EndSwitch

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

    WEnd

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

    Func _terminateClient()
    sendmessage($socket,"~!~disconnect~!~")
    TCPCloseSocket($socket)
    TCPShutdown()
    EndFunc

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

    Func sendmessage($socket,$msg)
    Return TCPSend($socket,$msg & $delim)
    EndFunc

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


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

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

    TCPStartUp()

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

    Global $ServerIP = "127.0.0.1"
    Global $MainSocket = TCPListen($ServerIP, 5555)
    If $MainSocket = -1 Then Exit MsgBox(0,"Server-Fehler","Listen Socket konnte nicht erstellt werden")
    Global $aPeers[1]=[0]
    Global $aDataTransfers[1]=[0]
    Global $peercount = 0
    Global $maxLen = 512000 ; tcprecv buffer
    Global $peerAliveTimer = TimerInit()
    Global $totalTimer = TimerInit()
    Global $aNickNames[1][2]=[["Socket","Nick"]]
    Global $delim = "$##$"
    Global $testfile = "S:\test.dat" ; <---- ÄNDERN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

    #Region ### START Koda GUI section ### Form=
    $guiServer = GUICreate("Server Control", 364, 414, 1328, 195)
    $labelmain = GUICtrlCreateLabel("Server Control Window", 48, 72, 113, 17)
    $labelpeers = GUICtrlCreateLabel("Connected Peers:", 48, 104, 89, 17)
    $labelpeerscount = GUICtrlCreateLabel($peercount, 192, 104, 30, 17)
    $labelNickName = GUICtrlCreateLabel("", 100, 170, 100, 17)
    $peercombo = GUICtrlCreateCombo("", 48, 200, 153, 25)
    $labelPeerList = GUICtrlCreateLabel("Peerlist", 48, 168, 38, 17)
    $btndiscpeer = GUICtrlCreateButton("dissconnect peer", 240, 192, 97, 41, $WS_GROUP)
    $btndiscallpeers = GUICtrlCreateButton("dissconnect all", 239, 246, 97, 41, $WS_GROUP)
    $btnsend = GUICtrlCreateButton("send", 210, 340, 50, 40, $WS_GROUP)
    $btnsendall = GUICtrlCreateButton("send all", 270, 340, 50, 40, $WS_GROUP)
    $inputmsg = GUICtrlCreateInput("", 40, 350, 150, 20)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1

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

    $newPeer = TCPAccept($MainSocket)
    if $newPeer <> -1 Then
    _ArrayAdd($aPeers,$newPeer)
    $aPeers[0] += 1
    ConsoleWrite("New TCP Connection established: " & $newPeer & @CRLF)
    fillPeerCombo()
    EndIf

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

    if $aPeers[0] > 0 Then
    $resetAliveTimer = True
    For $i=1 to $aPeers[0]
    ; check socket alive
    If TimerDiff($peerAliveTimer) > 10000 Then
    $alive = sendmessage($aPeers[$i],"~!~alive~!~")
    if $alive = 0 Then
    ConsoleWrite("TCP Connection lost: " & $aPeers[$i] & @CRLF)
    $resetAliveTimer = False
    removePeer($i)
    ExitLoop
    EndIf
    EndIf
    ; check new data
    $newdata = TCPRecv($aPeers[$i],$maxLen)
    If $newdata <> "" Then
    ;ConsoleWrite("rawData: " & $newdata & @CRLF)
    $aTCPMsg=StringSplit($newdata,$delim,1)
    ;_ArrayDisplay($aTCPMsg)
    For $x=1 To $aTCPMsg[0] ; msg kann mehrere teilnachrichten enthalten
    If $aTCPMsg[$x]="" Then ContinueLoop
    Switch $aTCPMsg[$x]
    Case "~!~disconnect~!~"
    ConsoleWrite("INFO by client (" & $aPeers[$i] & ") received: Session disconnected" & @CRLF)
    removePeer($i)
    ExitLoop 2
    Case "~!~alive~!~"
    ; ignore it
    Case "~!~getFile~!~"
    _ArrayAdd($aDataTransfers,$aPeers[$i])
    Global $transtimer = TimerInit()
    $filehandle = FileOpen($testfile,16)
    $aDataTransfers[0]+=1
    Case Else
    if StringInStr($aTCPMsg[$x],"~!~IDENT~!~",1) Then
    $nick = StringReplace($aTCPMsg[$x],"~!~IDENT~!~","")
    ConsoleWrite("INFO by client (" & $aPeers[$i] & ") received: Identified with nick (" & $nick & ")" & @CRLF)
    $temp = _ArraySearch($aNickNames,$aPeers[$i])
    If $temp = -1 Then
    ReDim $aNickNames[UBound($aNickNames)+1][2]
    $aNickNames[UBound($aNickNames)-1][0]=$aPeers[$i]
    $aNickNames[UBound($aNickNames)-1][1]=$nick
    sendmessage($aPeers[$i],"~!~Nick registered~!~")
    Else
    $aNickNames[$temp][0]=$aPeers[$i]
    $aNickNames[$temp][1]=$nick
    sendmessage($aPeers[$i],"~!~Nick changed~!~")
    EndIf
    GUICtrlSetData($labelNickName,$nick)
    Else
    ConsoleWrite("MSG by client (" & $aPeers[$i] & ") received: " & $aTCPMsg[$x] & @CRLF)
    EndIf
    EndSwitch
    Next
    EndIf
    Next
    If TimerDiff($peerAliveTimer) > 10000 And $resetAliveTimer = True Then $peerAliveTimer = TimerInit()
    EndIf

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

    If $peercount <> $aPeers[0] Then
    $peercount = $aPeers[0]
    GUICtrlSetData($labelpeerscount,$peercount)
    EndIf

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

    If $aDataTransfers[0] > 0 Then
    For $i=1 To $aDataTransfers[0]
    $datapacket=FileRead($filehandle,1024000)
    If @extended > 0 Then TCPSend($aDataTransfers[$i],$datapacket)
    If @error=-1 Then
    TCPCloseSocket($aDataTransfers[$i])
    _ArrayDelete($aDataTransfers,$i)
    $aDataTransfers[0]-=1
    $size = Round(FileGetSize($testfile)/1024/1024,0)
    $time = Round(TimerDiff($transtimer)/1000,0)
    if @Compiled Then
    MsgBox(0,"file transfer complete","FILE TRANSFER Complete: " & $size & " MB" & @TAB & $time & "s" & @TAB & Round($size/$time,2) & "MB/s")
    Else
    ConsoleWrite("FILE TRANSFER Complete: " & $size & " MB" & @TAB & $time & "s" & @TAB & Round($size/$time,2) & "MB/s" & @CRLF)
    EndIf
    ExitLoop
    EndIf
    Next

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

    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _terminateserver()
    Exit
    Case $btndiscpeer
    $socket = GUICtrlRead($peercombo)
    sendmessage($socket,"~!~server forced disconnect~!~")
    ConsoleWrite("Manual peer disconnect: " & GUICtrlRead($peercombo) & @CRLF)
    removePeer(_ArraySearch($aPeers,$socket))
    Case $btndiscallpeers
    ConsoleWrite("Manual peer disconnect All: " & @CRLF)
    For $i=1 to $aPeers[0]
    sendmessage($aPeers[$i],"~!~server forced disconnect~!~")
    TCPCloseSocket($aPeers[$i])
    Next
    Global $temp[1]=[0]
    $aPeers=$temp
    fillPeerCombo()
    Case $btnsend
    $socket = GUICtrlRead($peercombo)
    if $socket <> "" Then
    sendmessage($socket,GUICtrlRead($inputmsg))
    Else
    ConsoleWrite("FATALERROR: no peer selected: " & @CRLF)
    EndIf
    Case $btnsendall
    For $i=1 To $aPeers[0]
    sendmessage($aPeers[$i],GUICtrlRead($inputmsg))
    Next
    EndSwitch

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

    WEnd

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

    Func removePeer($peerID)
    if $peerID = -1 Or $peerID = 0 Then Return ConsoleWrite("FATALERROR: peer not found in array: " & $peerID & @CRLF)
    TCPCloseSocket($aPeers[$peerID])
    _ArrayDelete($aPeers,$peerID)
    $aPeers[0] -= 1
    fillPeerCombo()
    EndFunc

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

    Func fillPeerCombo()
    Local $temp = ""
    For $i=1 to $aPeers[0]
    $temp &= $aPeers[$i] & "|"
    Next
    GUICtrlSetData($peercombo,"")
    if $aPeers[0] <> 0 Then GUICtrlSetData($peercombo,StringTrimRight($temp,1),$aPeers[$aPeers[0]])
    EndFunc

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

    Func _terminateserver()
    For $i=1 to $aPeers[0]
    sendmessage($aPeers[$i],"~!~server shutdown~!~")
    TCPCloseSocket($aPeers[$i])
    ConsoleWrite("TCP Connection disconnected by server: " & $aPeers[$i] & @CRLF)
    Next
    TCPCloseSocket($MainSocket)
    ConsoleWrite("Server socket closed: " & $MainSocket & @CRLF)
    TCPShutdown()
    EndFunc

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

    Func sendmessage($socket,$msg)
    Return TCPSend($socket,$msg & $delim)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    Code
    FILE TRANSFER Complete: 1485 MB	345s	4.3MB/s
  • Controlsend im Hintergrund

    • misterspeed
    • 25. August 2012 um 19:03

    Das macht man nicht mit controlsend und einer Tastenkombination. Um Menüpunkte eines Fensters anzusteuern verwendet man

    [autoit]


    WinMenuSelectItem

    [/autoit]

    Davon ab ist es normal nicht notwendig den Datei Öffnen Dialog zu automatisieren. Die meisten Programme kann man auch einfach per run und Parameter starten um eine Datei zu öffnen.

    Beispiel:

    [autoit]


    $filepath = "C:\test.txt"
    run("notepad.exe " & '"' & $filepath & '"')

    [/autoit]
  • window mode Frage

    • misterspeed
    • 23. August 2012 um 10:19

    Sofern du zwischen maximiert und nicht maximiert switchen wolltest fällt mir da auf anhieb lediglich winmove ein, das sollte dir erlauben das Fenster auf eine beliebige Größe und Position zu bekommen.

    [autoit]


    winmove()

    [/autoit]
  • window mode Frage

    • misterspeed
    • 23. August 2012 um 10:11

    Keine Ahnung was du mit Restore down mode meinst, vielleicht würde ein Screenshot helfen, damit auch jeder weiß wovon du sprichst.


    Es gibt jedenfalls @SW_RESTORE ;)

  • Mit TCP eine Datei auf FTP server hochladen/runterladen

    • misterspeed
    • 22. August 2012 um 14:10

    Das geht so auch nicht. Schon alleine deswegen, weil die lokalen Pfade "C:\blah\" lauten. Auf dem FTP lauten die Pfade nachher aber "\blah\".
    Trenn doch einfach Datenermittlung von produktiven Funktionen wie deinem FTP Upload. Hast du erstmal alle Daten in Arrays ist es viel einfachher diese in modifizierter Form für die FTP Kommandos zu nutzen.

    Angenommen du hast meine vollständige Ordnerliste aus Beispiel 1

    [autoit]


    for $i=1 to ubound($aResult)-1
    _FTP_DirCreate($FTPConnect, stringtrimleft($aResult[$i]),2))
    ;oder
    _FTP_DirCreate($FTPConnect, stringreplace($aResult[$i]),"c:\testpfad\teil_des_pfades_der_weg_soll_und_nix_auf_dem_ftp_verloren_hat",""))
    next

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Mit TCP eine Datei auf FTP server hochladen/runterladen

    • misterspeed
    • 22. August 2012 um 13:30

    Also nochmal etwas Erklärung zu meinen Beiden Beispielen.

    Im ersten Beispiel ermittle ich alle Ordner und deren Unterordner und deren Unterordner usw.
    Das mache ich in dem ich zuerst die Ordner des Hauptordners ermittle. Nun gehe ich alle Ordner des Hauptordners durch und prüfe durch erneuten Aufruf der Funktion ob sich in diesem Ordner ebenfalls Ordner befinden, wenn ja werden diese Ordner erneut durch Aufrufe der Funktion geprüft. Sobald ein Ordner keine Ordner mehr enthält wird eine Ebene darüber der nächste Ordner auf Unterordner geprüft. Das geht solange, bis das Script wieder am Anfang angekommen ist, also im letzten Ordner des Hauptordners. Am Ende sind wir durch alle Ordner gegangen und haben uns diese in einem Array gespiechert.


    Beispeilstruktur:

    Code
    Hauptordner
     -Ordner1
       --Unterordner1a
       --Unterordner1b
     -Ordner2
       --Unterodner2a
     -Ordner3


    Scriptablauf:

    1. Liste Hauptordner erstellen
    2. Liste Ordner1 erstellen -> Funktion wird neu mit gewünschtem Ordner1 aufgerufen
    3. Liste Unterordner1a erstellen -> Funktion wird neu mit gewünschtem Unterordner1a aufgerufen
    4. Unterordner1a enthält keine Ordner mehr, alo $aTemp=0 --> return
    5. Liste Unterodner1b erstellen -> Funktion wird neu mit gewünschtem Unterordner1b aufgerufen
    6. Unterordner1b enthält keine Ordner mehr, alo $aTemp=0 --> return
    7. Liste Ordner2 erstellen -> Funktion wird neu mit gewünschtem Ordner2 aufgerufen
    ....

    Das zweite Script macht nun folgendes:

    Wir haben ein Array mit allen Ordnern aus der ersten Funktion von oben, nun gehen wir in der äusseren For Schleife alle Ordner durch. Für jeden Ordner erstellen wir eine Dateiliste und jede dieser Dateinamen (innere For Schleife) inklusive zugehörigem Ordnerpfad schreiben wir in das Ergebnis Array. Wenn einer der Ordner aus der äusseren Schleife keine Dateien enthält, dann überspringen wir diesen Ordner mit continueloop.

    Scriptablauf:

    1. Erster Ordner der Ordnerschleife ist dran
    2. Dateiliste des ersten Ordners erstellen
    3. innere Schleife, jede gefundene Datei aus dem ersten Ordner in ein Array speichern
    4. Zweiter Ordner ist dran
    ...


    Hoffe nun verstehst du in etwa was da passiert.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™