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. Racer

Beiträge von Racer

  • AD-Verbindung unter WinPE

    • Racer
    • 11. September 2015 um 10:08

    Hallo!

    Wie im Titel schon beschrieben versuche ich eine AD-Abfrage vor der Installation eines Windows zu machen. Sinn und Zweck der Aktion: Gibt es schon ein Computerkonto im AD ?
    So weit komme ich aber nicht, denn die Verbindung zum AD kommt gar nicht zustande!

    Dazu verbinde ich mich mit Hilfe das AD_UDF zur Domäne:

    Code
    local $username = "*********" ;wird im Forum nicht veröffentlicht
    local $password = "********"   ;wird im Forum nicht veröffentlicht
    local $domain = "DC=server,DC=to,DC=at" 
    local $server= "dc1.server.to.at" ;Domaincontroller
    $ret = _AD_Open($username,$password,"","server.to.at",$domain)
    echo ("AD_Open:" & $ret & @CRLF & "@error:" & @error)

    Auf meine Arbeitsrechner (Windows 7) als Mitglied im AD funktioniert das immer. in $ret steht 1 und @error hat 0. So weit so gut!

    Verwende ich das compiliert Script in meiner Installationsumgebung (WinPE5 V6.3.9600) bekomme ich bei $ret 0 und @error:4 zurück!


    Ein "net use * \\server\freigabe /user:domain\user kennwort" funktioniert - ergo, DNS OK, AD OK, Netz OK

    Nachdem ich die Doku auf und ab studiert habe suche ich bei Euch hilfe!

    lg
    Racer

  • Autolt geeignet??

    • Racer
    • 26. Juli 2015 um 12:51
    Zitat von Lottich

    Hallo Christian

    Grundsätzlich ist dein Vorhaben durchaus mit AutoIt realisierbar. Allerdings nur für Windows Systeme und leider nicht für Tablets.
    Soweit mir bekannt ist, arbeiten diese ausschliesslich mit ARM-Prozessoren. Damit kann AutoIt allerdings nichts anfangen.


    MfG Lottich

    Nur zur Info: Es gibt auch Tablets mit Intelprozessoren (i3, Atom,...) auf denen Windows läuft!
    Mit Windows 10 für ARM wird es noch ein bißchen dauern - aber die Erste Version von Window 10 auf einen Raspery Pi 2 habe ich schon gesehen und der hat auch eine ARM-Prozessor!

    lg
    Racer

  • Dos Output von "fremden" Prozess lesen

    • Racer
    • 19. Mai 2015 um 14:06

    Dachte ich mir schon das es nicht so einfach geht :(

    Aus dem Script heraus hatte ich keine Probleme - das ist ja sehr gut dokumentiert, aber in diesen speziellen Fall hätte ich es getrennt benötigt!

    Warum tut man so was: Eigentlich brauche nur einen einfachen (optisch ansprechenden) Fortschrittsbalken, der aber auch dann reagiert wenn per Hand in einem Dosfenster ein robocopy angestossen wird! Ergo zwei eigenständige Prozesse die nicht miteinander Verwandt sind :)

    lg

  • Dos Output von "fremden" Prozess lesen

    • Racer
    • 19. Mai 2015 um 13:05

    Hallo!

    Wie schon in meinen Titel geschrieben möchte ich einen Dosouput auslesen. Die Herausforderung ist das der Prozess nicht von AutiIT aus gestartet wird. Geht so etwas?

    Was habe ich bisher:

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

    ;Erst was tun wenn der Prozess "robocopy.exe" gestartet worden ist
    do
    $ret = ProcessGetStats ("robocopy.exe")
    sleep (10)
    until $ret <> 0

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

    ;Hier den Stream lesen
    do
    $ret = ProcessGetStats ("robocopy.exe")
    $line = StdoutRead($ret)
    if $line <> "" then
    ConsoleWrite($line & @crlf)
    endif
    until $ret = 0

    [/autoit]

    Das Programm reagiert, da das Script brav wartet bis ich einen Robocopy Befehl im Dos-Fenster gestartet habe, und beentet auch brav wenn der Copy-Prozess abgeschlossen ist!
    Nur beim "Consolewrite" sehen ich nichts!

    lg
    Racer

  • Script als Dienst / Fehler 1053

    • Racer
    • 16. Dezember 2014 um 11:56

    Naja, dann bist mit dem Task eh richtig unterwegs :)

    Der Task wird wie ein Dienst vom System her gestartet und läuft. Der Prozesse ist im Taskmanager sichtbar (Benutzer: system) und kann nur von einern anderen Administrator (=user mit Adminrechte) beendet werden.
    Auf eine TS ist das unabhängig ob ein User dann angemeldet ist oder nicht - das hat nichts mit den Task zu tun!
    Was nicht geht (unter Windows 2003), erst ab Vista (ergo Windows 2008 Server) den Task remote über die Aufgabensteuerung zu beenden. Für ältere System (die man eh nicht mehr verwenden sollte) würde dann nur die Möglichkeit bestehen den Prozesse per RPC "abzuschiessen" (z.B.: pskill \\server ...)


    lg
    Racer

  • Script als Dienst / Fehler 1053

    • Racer
    • 12. Dezember 2014 um 09:19

    Hallo!

    Das Thema Autoit als Server laufen zu lassen interessiert mich auch brennend. Leider bin ich auch nicht viel weiter gekommen als die Programme per Helper als Service zu integrieren. Direktes Eintrage terminiert nach kurzer Zeit mit einem Fehler. Scheinbar muss ein Servicedienst anderes Erzeugt werden, das (ist nur eine Vermutung) vom Compiler abhänig ist.

    Eine - für mich - elegante Methode das zu umgehen ist über den taskscheduler von Windows. Der läßt sich auch remote steuern, Programme mit Systemrechte laufen und es gibt eine Commandline dafür.

    Um ein selbstgeschriebenes Programm als "Dienst" laufen zu lassen mache ich folgenden Eintrag:
    schtasks /create /SC onstart /TN MeinProgramm /TR "c:\windows\system32\MeinProgramm.exe" /user:leser" /RU SYSTEM /RL highest /F

    Damit wird "MeinProgramm.exe" bei jedem Systemstart mit Systemrechte gestartet.

    vielleicht hilft Dir das!

    lg
    Racer

  • Fenster schliessen

    • Racer
    • 17. September 2014 um 11:43

    Danke das hat geholfen - manchmal ist am wirklich schon betriebsblind!

    Schade nur das ich jetzt alle case-Abfragen anpassen muss.... sind doch schon viele Zeilen Code geworden!

    lg
    Racer

  • Fenster schliessen

    • Racer
    • 17. September 2014 um 08:33

    Hallo!

    Ich brauche Eure Hilfe - vielleicht ist es auch ganz leicht und ich bin nur blind, aber bis jetzt habe ich weder in der Hilfe noch im Forum eine Lösung gefunden.

    Ich habe zwei Fenster, beide haben einen Schliessen-Button, aber nur bei einem soll das Programm beendet werden. Wie kann ich unterscheiden bei welchen Fenster das $GUI_EVENT_CLOSE gedrückt worden ist?

    Beispiel:

    [autoit]

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

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

    $Form1 = GUICreate("Form1", 200, 200, 10, 10)
    GUISetState(@SW_SHOW)

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

    $Form2 = GUICreate("Form2", 200, 200, 120, 10)
    GUISetState(@SW_SHOW)

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

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

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

    EndSwitch
    WEnd

    [/autoit]

    Was ich vermeiden möchte ist das ich den GUIOnEventMode verwenden muss, denn mein eigentliches Programm ist schon fertig und basiert aufG UIGetMsg.

    lg
    Racer

  • Sprung mit Tab-Taste nicht mehr möglich

    • Racer
    • 12. August 2014 um 15:04

    Ich habe den "Fehler" durch Zufall selber gefunden:

    Ändere ich die Reihenfolge wie die Fenster erzeugt werden von "Runtime Log" -> "Bereicht" -> "Hauptfenster" auf "Hauptfenster" -> "Runtime Log" -> "Bereicht"
    funktioniert der Sprung mit der TAB-Taste auch wieder.

    Aber vielleicht hat jemande eine Erklärung für mich, denn Verstehen tue ich es nicht!

    lg
    Racer

  • Sprung mit Tab-Taste nicht mehr möglich

    • Racer
    • 12. August 2014 um 14:49

    Hallo!

    Nachdem ich mein Projekt fast fertig habe, bin ich auf eine kleine "Unangenehmheit" gestossen:
    In einer GUI habe ich 3 Eingabefelder und hier kann ich nicht mehr mit der TAB-Taste in das nächste springen!

    Gibt es da einen Parameter bei der Erstellung der GUI der zubeachten ist (ich bin da leider nicht so ganz Sattelfest)?

    [autoit]

    func kassenbuch_gui ()

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

    local $y_pos
    local $x_pos
    local $ret, $tmp

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

    $ret = ini_file_read ($inifile)

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

    if $ret = -1 then
    MsgBox (16, "Warnung", "Datei " & $inifile & " nicht gefunden!" & @crlf & @crlf & "Programm kann fortgesetzt werden")
    $y_pos = 20
    $x_pos = 20
    else
    $x_pos = gettok ($ret, "|" , 1)
    $y_pos = gettok ($ret, "|" , 2)
    endif

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

    ;Eigenes Fenster für Runtime Log (wird nicht in einer Datei aufgezeichnet)
    $logview_fenster = GUICreate("logviewer", 500, 300, 10, 10, BitOR($ES_READONLY,$ES_WANTRETURN))
    $logvier_edit = _GUICtrlRichEdit_Create($logview_fenster, "", 0, 0, 495, 280, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    GUISetState($GUI_HIDE, $logview_fenster)

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

    ;Eigenes Fenster für den Bericht
    $Bericht = GUICreate("Bericht", 700, 500, 10, 10, BitOR($ES_READONLY,$ES_WANTRETURN))
    $Obj = ObjCreate("Shell.Explorer.2")
    $browser = GUICtrlCreateObj($Obj, 0, 0, 695, 440)
    $exit = GUICtrlCreateButton("Exit", 600, 445, 75, 25)
    GUISetState(@SW_HIDE)

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

    $kassenbuch = GUICreate($titel, 820, 650, $x_pos, $y_pos)
    $menu_datei = GUICtrlCreateMenu("&Datei")
    $menu_laden = GUICtrlCreateMenuItem("Laden", $menu_datei)
    $menu_speichern = GUICtrlCreateMenuItem("Speichern", $menu_datei)
    $menu_speichernals = GUICtrlCreateMenuItem("Speichern als", $menu_datei)
    $menu_ende = GUICtrlCreateMenuItem("Ende", $menu_datei)
    $info = GUICtrlCreateMenu("&Info")
    $info_about = GUICtrlCreateMenuItem("About", $info)
    $kalender = GUICtrlCreateMonthCal($heute, 5, 460, 191, 164)
    $info_lable = GUICtrlCreateLabel("Info", 5, 0, 1000, 30)
    GUICtrlSetFont($info_lable, 12, 800, 0, "MS Sans Serif")
    GUICtrlSetColor ($info_lable, 0x0000ff)
    $gruppe1 = GUICtrlCreateGroup("Eingabefeld", 200, 460, 615, 97)
    $Einnahme = GUICtrlCreateRadio("Einnahme", 210, 480, 97, 33)
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Ausgabe = GUICtrlCreateRadio("Ausgabe", 210, 510, 100, 25)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $feld1 = GUICtrlCreateInput ("Textfeld", 320, 510, 120, 21)
    $feld2 = GUICtrlCreateInput("", 460, 510, 60, 21)
    $feld3 = GUICtrlCreateInput("", 530, 510, 60, 21)
    $text_lable1 = GUICtrlCreateLabel("Kunde", 320, 490, 120, 19)
    $text_lable2 = GUICtrlCreateLabel("Arbeit €", 460, 490, 120, 19)
    $text_lable3 = GUICtrlCreateLabel("Verkauf €", 530, 490, 120, 19)
    $text_lable4 = GUICtrlCreateLabel("Kategorie", 600, 490, 120, 19)
    $kategorie = GUICtrlCreateCombo("", 600, 510, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$CBS_SORT,$CBS_DROPDOWNLIST ))
    GUICtrlSetData ($kategorie, "|" & $kategorie_daten)
    GUICtrlCreateGroup($kategorie, -99, -99, 1, 1)
    $gruppe2 = GUICtrlCreateGroup("Steuerung", 200, 550, 615, 60)
    $enter = GUICtrlCreateButton("Enter", 216, 570, 75, 25)
    $clear = GUICtrlCreateButton("Clear", 312, 570, 75, 25)
    $sort = GUICtrlCreateButton("Sortieren", 408, 570, 75, 25)
    $nachunten = GUICtrlCreateButton("nach unten", 504, 570, 75, 25)
    $Berichte = GUICtrlCreateButton("Bericht", 600, 570, 75, 25)
    $logview = GUICtrlCreateButton("Logview", 704, 570, 75, 25)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $gruppe3 = GUICtrlCreateGroup("Anzeige", 5, 32, 810, 430)
    $ListView1 = GUICtrlCreateListView("Datum EN|Datum DE|E/A|Text |WERT1|WERT2|Kategorie ", 10, 56, 800, 400)
    $contextmenu = GUICtrlCreateContextMenu ($ListView1)
    $bearbeiten = GUICtrlCreateMenuitem ("bearbeiten", $contextmenu)
    $loeschen = GUICtrlCreateMenuitem ("löschen", $contextmenu)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    endfunc

    [/autoit]

    Alles was Grafisch ist wird teilweise durch eine INI-File bestimmt (Position der GUI, Inhalt vom Combofeld,...) der Rest ist statisch.
    Genau gesagt geht es um das $feld1 bis $feld3 !

    Habt Ihr einen Tipp für mich?

    lg
    Racer

    Ach ja: Bei der Eingabe ist mir aufgefallen das im Eingabefeld unregelmäßig die Backspace-Taste bzw. die Cursortasten nicht mehr funktionieren!

  • Dictionary dynamsch erstellen

    • Racer
    • 7. August 2014 um 19:56
    Zitat von PainTain

    Wenn ich deinen Code jetzt richtig verstehe, wären, glaube ich, Maps ideal für dich. Gibt es seit der Beta 3.3.13.4, lad dir einfach mal die aktuelle Beta runter und probier mal die Maps aus, bevor du mit Assign rumhantierst.

    Edit: Hier mal ein Beispiel zu Maps: http://www.autoitscript.com/forum/topic/16…a/#entry1185006

    Ohne das ich mich jetzt mit Maps auskenne, sieht das Beispiel schon sehr interessant aus! Das werde ich mir mal in Ruhe geben!

    Vielen Dank!

    @all: Ihr seit alle Spitze - so ein gutes Supportforum gibt es selten!!

  • Dictionary dynamsch erstellen

    • Racer
    • 7. August 2014 um 19:23

    Vielen Dank für Eure Antwort!

    BugFix : Nein, eben nicht! ich brauche für jede Kategorie (z. Schuhe, Hosen, Hemden,...) ein eigenes Dictionary! Ich mag Array's, nur manchmal sind sie einfach nicht gut zum Handhaben, insnbesonders wenn einzelen Elemente in großen Datenmengen (>10000) gesucht werden soll. Und da noch querverweise....da sind die Dic's viel schneller!


    Ich habe jetzt eine Lösung gefunden (nach langer Internetsuchen):

    Beipiel:

    [autoit]


    Dim $dic[4]
    $dic[1] = "eins"
    $dic[2] = "zwei"
    $dic[3] = "drei"

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

    for $i = 1 to 3
    Assign ($dic[$i] , ObjCreate("Scripting.Dictionary"))
    next

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

    $eins.add("eins","erstes Dic")
    $zwei.add("zwei","zweites Dic")
    $drei.add("drei","drittes Dic")

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

    msgbox (0 , "Ergebnis", $eins.item("eins") & @crlf & $zwei.item("zwei") & @crlf & $drei.item("drei"))

    [/autoit]

    @Tolleule: hmmm...sieht interessant aus! Muss werde ich mir auch ansehen

    vielen Dank!

  • Dictionary dynamsch erstellen

    • Racer
    • 7. August 2014 um 12:45

    Hallo!

    Ich stehe wiedermal an und hoffe das Ihr mir helfen könnt! Die Forumsuche hat mir leider keine Ergebnisse gebracht!

    Ich würde gerne Dictionary's dynamisch erzeugen, doch ich weiß nicht ob und wie das geht
    Momentan erstelle ich ein "statisches" Objekt so:

    [autoit]

    $dback = ObjCreate("Scripting.Dictionary")

    [/autoit]

    Jetzt würde ich aber für dynamische Kategorien (werden durch den Benutzer erzeugt = weiß nicht wie viele es geben wird) ein eigenes Dictionary benötigen. Am Ende beinhaltet des Dictionary (=Kategorie) viele Daten!
    Dadurch ich kann es nicht vorab hardcodet erzeugen.

    Ein Array fällt leider aus - das wäre für meine Aufgabenstellung mehr sehr schwer möglich!

    vielen Dank!
    Racer

  • RegExp (ich verzweifle...)

    • Racer
    • 27. Mai 2014 um 15:39

    Vielen Dank für den Hinweis!

    Ich werde das gleich in mein Script übernehmen!

    lg
    Racer

  • RegExp (ich verzweifle...)

    • Racer
    • 27. Mai 2014 um 10:28

    Hallo!

    Ich hoffe Ihr könnt mir helfen, denn das RegExp treibt mich noch in den Wahnsinn.

    Folgendes Problem habe ich:

    [autoit]


    msgbox (0 , "" , (stringregexp ("genau123" , ".*au", 0 )))

    [/autoit]

    Autoit sagt mir das das Suchmuster übereinstimmt (so weit hat er ja auch recht) nur ich brauche den rechten Teil nach (au) nicht. Daher stimmt das Ergebnis für mich nicht!
    Frage: Wie kann ich im RegExp sagen das nach dem "au" nichts mehr stehen darf und daher die Antwort falsch ist?
    Ich hoffe ich habe das nicht zu schlecht beschrieben was ich möchte!

    Beispiel:

    stringregexp ("genau123" , ".*123", 0 ....true
    stringregexp ("genau123" , ".*au123", 0 ....true
    stringregexp ("genau123" , ".*genau", 0 ....false (da ja im Suchstring hinten noch 123 steht)

    vielen Dank

    lg
    Racer

    --------------------------------------------------------------------------------------------------------

    Fast habe ich die Nerven weggeschmissen, doch im letzten Moment habe ich die Lösung gefunden:

    [autoit]

    msgbox (0 , "" , (stringregexp ("genau123" , ".*au\b", 0 )))

    [/autoit]

    Durch das \b wird "exakt" gesucht.....

  • TCP-Verbindung (Dauer)

    • Racer
    • 22. April 2014 um 16:12
    Zitat von Christoph54


    Das hat nichts mit einem Fehler in der Hilfe zu tun. Dein Fehler ist lediglich ein Resultat aus der Tatsache, dass du TCP noch nicht verstanden hast bzw. hattest.
    Nebenbei bemerkt: Sendet der aktuelle Client nicht in ein paar Sekunden bzw Millisekunden seine Daten wird die Verbindung vom Server her abgebrochen ob wohl der Client noch nicht senden konnte. Außerdem wird alles größer 4096 einfach abgeschnitten...


    Lieber Christoph!

    Ich habe weder was von einem Fehler in der Doku geschrieben noch mag ich es wenn Du versucht mir zu sagen was ich kann oder nicht! Deine Aussage hat nichts mit meiner gestellten Frage zu tun! Vielleicht hast Du die Doku anders verstanden als ich - ok! Aber bitte unterlasse solche Bemerkungen das ich (ohne das Du mich kennst) nichts von TCP verstehe!

    Die Doku ist nicht perfekt, aber ich bin trotzdem denen sehr Dankbar die sich die Mühe machen und eine Übersetztung schreiben! Wenn dann was nicht ganz klar ist gibt es immer noch ein Forum, und in diesen Fall hat mir misterspeed sehr schnell und professionell geholfen (vielen Dank nochmal an der Stelle)!

    lg
    Racer

  • TCP-Verbindung (Dauer)

    • Racer
    • 22. April 2014 um 11:04

    Jetzt ist der Groschen gefallen!

    Ich habe jetzt meine Serverteil so geändert:

    [autoit]

    While 1
    $socketid = TCPAccept($socket)
    If $socketid >= 0 Then
    $senderip = SocketToIP ($socketid)
    local $input = TCPRecv ($socketid, 4096)
    filewrite ($datei, @HOUR & ":" & @MIN & ":" & @SEC & " " & $senderip & " " & $input & @crlf)
    TCPCloseSocket ($socketid)
    EndIf
    WEnd

    [/autoit]

    Und siehe da, es wird nur das eine Port (in meinen Fall TCP 2000) angezeigt!

    Super, vielen Dank!

    Leider geht das nicht so ganz aus der deutschen Doku hervor, denn man kann das leicht (so wie ich) so interpredieren, das damit der Socket (der lauscht) wieder geschlossen wird!!!!

    lg
    Racer

    PS: TCPShutdown kommt noch - versprochen ;)

  • TCP-Verbindung (Dauer)

    • Racer
    • 22. April 2014 um 10:50
    Zitat von misterspeed

    Ahja und natürlich sollte man nicht nur unbenutzte Sockets schließen, sondern bei Programmende auch

    [autoit]

    tcpshutdown()

    [/autoit]

    aufrufen, was letztlich alles sauber aufräumen sollte.

    Ok, jetzt hast Du es geschafft - ich stehe entgültig am Schlauch ?( ! Wie schliesse ich Sockets die nicht gebaucht werden? Ich mache ja nur eines auf und das brauche ich in alle Ewigkeit.... daher auch kein TCPShutdown.....

  • TCP-Verbindung (Dauer)

    • Racer
    • 22. April 2014 um 10:45
    Zitat von misterspeed

    Zwei Dinge...
    Server: Du schließt den Socket nicht, also kaum verwunderlich, dass dieser noch ewig rumgammelt
    Client: Wozu setzt du millionenfach das $GUI_EVENT_CLOSE in deiner while Schleife? Warum setzt du Events für Controls und aktivierst den oneventmode erst danach?

    Hallo!

    Danke für deine Antwort:

    zu Server: Naja, wenn ich den Socket schliesse kann ja keiner mehr was schicken!

    oder habe ich laut Doku etwas falsch verstanden:

    1) TCP starten
    2.) Socket aufmachen
    3.) lauschen am Netz und bei Eingang darauf Daten verabeiten

    Es Webserver lauscht ja auch, mach dann für den Datentransfer ein Socket auf und baut es sofort wieder ab... so was würde ich hier brauchen.
    Oder kann ich das von Client her aus irgendwie sagen das die Verbindung gecloset werden kann?


    zu Client: stimmt, ist aber nur ein Testclient der dann wieder weg kommt! Ich habe den Client nur damit ich mit irgendwas Daten senden kann! Bin mit der GUI noch nicht so sattelfest!

    lg
    Racer

  • TCP-Verbindung (Dauer)

    • Racer
    • 22. April 2014 um 10:16

    Hallo!

    Nachdem ich das Forum studiert aber leider nichts zu dem Thema gefunden habe frage ich mal die Spezialisten:

    Wo will ich hin: Ein Serverprogramm das via TCP Daten empfängt und in ein Logfile speichert - gibt bereits und funktioniert
    Weiter gibt es einen Testclient der Daten schickt - funkt local als auch übers Netz!

    Jetzt kommt die Frage:

    Ich mache am Server ein Socket auf das lauscht auch ganz brav am Netz und wenn Daten kommen reagiert es wie gewollt darauf. ABER die Verbindung wird nicht nach gleich abgebaut (mit einem TCP-Monitor sieht man das). Kommt die nächste Verbindung wird ein Socket aufgemacht usw usw.

    Da jetzt die Clients mehr oder weniger gleichzeitig die Daten schicken werden so hunterte Ports am Server belegt und im schlimmsten Fall kracht es dann!

    Ich habe versucht mit der Option TCPTimeout die Zeit zu verkürzen damit das Port schneller freigegeben wird, aber das scheint hier wirkungslos zu sein!

    Nur um einen Eindruck zu bekommen ein Screenshot (die Verbindungen sind auch Minuten nachdem der Client beendet worden ist noch da):

    [Blockierte Grafik: data:image/png;base64,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]

    Ist das einfach so (weil Windows so ist) oder gibt es da noch einen anderen Trick? Oder wäre hier UDP besser geeignet?

    Sicherheitshalber meine beiden Scripts:

    Server:

    [autoit]

    ;Druckerdaten erfassung - Server

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

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

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

    local $logfile = "d:\printer.log"
    local $datei = FileOpen ($logfile, 1)

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

    ;TCP-Service starten
    TCPStartup ()

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

    local $ip=@ipaddress1
    local $port = 2000
    local $text=""
    local $senderip

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

    local $socket = TCPListen ($ip,$port, 2048)
    local $socketid = 0

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

    While 1
    $socketid = TCPAccept($socket)
    If $socketid >= 0 Then
    $senderip = SocketToIP ($socketid)
    local $input = TCPRecv ($socketid, 4096)
    filewrite ($datei, @HOUR & ":" & @MIN & ":" & @SEC & " " & $senderip & " " & $input & @crlf)
    EndIf
    WEnd

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

    func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf

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

    $sockaddr = 0

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

    Return $aRet
    EndFunc ;==>SocketToIP

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


    Testclient:


    [autoit]

    ; TCP-Sender test

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

    #include <advfha_proc.au3>

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

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

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("TCP-Client", 602, 347, 216, 659)

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

    $Edit1 = GUICtrlCreateEdit("", 32, 56, 545, 217, $ES_READONLY)
    ;GUICtrlSetState(-1, $GUI_DISABLE)

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

    global $Eingabe = GUICtrlCreateInput("Eingabe", 32, 296, 441, 21)
    $Senden = GUICtrlCreateButton("Senden", 496, 296, 75, 25)
    GUICtrlSetOnEvent(-1, "senden")

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

    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 32, 16, 130, 21)
    _GUICtrlIpAddress_Set($IPAddress1, "x.x.x.x")

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

    $Port = GUICtrlCreateInput("2000", 168, 16, 49, 21)
    ;GUICtrlSetData($Port, "2000")

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

    GUISetState(@SW_SHOW)

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

    #EndRegion ### END Koda GUI section ###
    Opt("GUIOnEventMode", 1)

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

    ;TCP-Service starten
    TCPStartup()

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

    global $socket_jn = -1
    global $socketid = 0

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

    While 1
    GUISetOnEvent($GUI_EVENT_CLOSE, "Ende")
    WEnd

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

    func Ende()
    exit
    endfunc ;==>Ende

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

    func senden()

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

    $kanal = GUICtrlRead($Port)
    $ip = _GUICtrlIpAddress_Get($IPAddress1)

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

    local $text = GUICtrlRead($Eingabe)
    local $alttext = GUICtrlRead($Edit1)

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

    $socketid = TCPConnect($ip, $kanal)
    local $ret = TCPSend($socketid, $text)
    TCPCloseSocket($socketid)

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

    $text = $alttext & @crlf & ">" & @HOUR & ":" & @MIN & ":" & @SEC & " on " & $ip & ":" & $kanal & " SocketID:" & $socketid & " " & $text

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

    GUICtrlSetData($Edit1, $text)
    GUICtrlSetData($Eingabe, "")

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

    endfunc ;==>senden

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

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™