Angepinnt [HOW-TO]Server Programmieren in AutoIT + TCP Infos

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [HOW-TO]Server Programmieren in AutoIT + TCP Infos

      Einführung in TCP




      ICh red net gern übern heißen brei also fangen wa glei an x)

      TCP steht für Transmission Control Protocol
      Bei einer TCP verbindung wird im gegensatz zu einer UDP Verbindung ein virtueller kanal hergestellt, also eine direkte und bleibende verbindung.

      Ein UDP Server zB. empfängt daten ohne darauf vorbereitet zu sein.
      Aber ein TCP Socket ist immer darauf vorbereitet.
      Das ganze merkt man auch wenn man sich den Script eines TCP Server mal anschaut. ( siehe unten im howto server programmieren )
      -Als Erstes muss das Socket aufgestellt werden
      -Dann Müssen in der Endlos-Schleife alle einkommenden verbindungen angenommen ewrden, bevor diese alle daten senden können.
      -Und nach der annahme kann der Server erst vom Client Socket daten empfangen.

      Also man merkt dass beim TCP erst eine Stabile VErbindung erstehen muss bevor daten ausgetauscht werden können, dass ist aber auch besser da der TCP Server dann weiß mit wem er es da zu tuhen hat ohne ip und des gleichen zu überprüfen.

      Zum vergleich, hier der Aufbau eines Chat-Systems, einmal TCP und einmal UDP

      TCP:
      -Server Socket steht

      ->Client wird am anderen PC vom User gestartet
      -User gibt daten ein und klickt auf "Verbinden"
      ->Client verbinded zum Server

      -<Server Akzeptiert Client

      -Kanal ist nun hergestellt ( Verbindung hergestellt )

      ->Client senden nun Daten

      -<Server empfängt daten
      -<Server speichert daten des Clients und setzt den user auf Online
      -<Server Registriert User alle Informationen sind gespeichert

      - User startet Chat miit anderem USer
      ->Client sended Chat Partner ID an Server

      -<Server kennt beide User und stellt nur noch den Chat ein

      - User können chatten

      und jetzt das nochmal mit UDP:

      -Server Socket steht

      ->Client wird am anderen PC vom User gestartet
      -User gibt daten ein und klickt auf "Verbinden"
      ->Client Sendet Daten direkt an Server

      -<Server bestätigt Daten und sendet ein paar Informationen

      - User startet Chat mit anderem User

      ->Client Sended ganze Zeit Username,Pssswort und dann die ChatPartner ID und dann noch die Nachricht zum Server

      -User könnte etwas beschwerter chatten da der Client mehr CPU verbraucht für den PING der alle 10sec an den Server gesended wird damit der Server weiß dass der User Oline ist

      Ihr merkt dass der TCP Server Intiligenter ist und alles schneller abläuft.
      Durch den Virtuellen kanal merkt der Serevr wenn der Client plötzlich offline geht.
      zB. wenn beim User der PC abstürtzt oder der Strom ausfällt ^^
      Und der Chat Client nicht den Disconnect Command sendet.

      Ich hoffe ihr habt verstanden was ich mit all den Beispielen sagen möchte und was TCP und UPD eigentlich sind.
      Denn beide Protokolle werden von AutoIT unterstützt.



      Serverprogrammierung in AutoIT



      Als erstes erstellst du einen neuen Script und nennst es "MyFirstServer.au3".
      Dann öffnest du das script durch Rechtsklick ->> Edit Script.
      Danach öffnet sich SciTE, der Editor, und du siehst schon ein paar Dinge in grün.
      Dies sind Kommentare.
      Es gibt Komentare die mit ";" anfangen und für Mehrzeilige Komentare gibt es "#cs" und "#ce" / #comments-start" und #comments-end".
      Also du kannst die schon vorgegebenen Komentare ignorieren, ausfüllen oder wie ich es mache, sie einfach löschen.


      Dein Server wird am Ende als Konsole ausgeführt, also es gibt kein Fenster.
      Also nachher beim compilieren darauf achten , dass das Script als CUI compiliert wird!

      Das erste was du eingibst ist :

      Quellcode

      1. TCPStartup()
      Damit wird die TCP Libary gestartet und du kannst TCP in deinem Script verwenden. (Ohne DLL oder so, AutoIT ist halt Betriebssystem abhängig)

      Dann, damit du auch ein Socket hast wo dich Clientprogramme kontaktieren können :

      Quellcode

      1. $MainSocket = TCPListen("127.0.0.1",3000,100)
      2. ;Also der Server läuft auf der IP : 127.0.0.1 (localhost) und der Port ist 3000.
      3. ;Die 100 am Ende steht dafür das maximal 100 Clients angenommen werden.
      4. ;Natürlich könnt ihr alle Angaben frei ändern.
      Dann, damit dein Script nicht direkt nachdem u ihn gestartet hast wieder ausgeht.
      Eine Endlose Schleife :

      Quellcode

      1. while 1
      2. wend
      So jetzt ist dein Script endlos.

      Nur kann er jetzt noch nichts empfangen und ist so gut wie nutzlos.

      Damit er was empfangen kann und überhaupt Verbindungen annehmen kann ist eine neue Funktion nötig.

      Als erstes :

      Quellcode

      1. $NewSocket = TCPAccept($MainSocket)
      und zum empfangen der angenommenen Verbindungen :

      Quellcode

      1. TCPRecv($NewSocket,2048)
      2. ;er empfängt daten von dem $NewSocket also neu angenommenen Verbindungen
      3. ;er empfängt die Nachrichten (egal ob Daten oder sonst was) mit bis zu 2048kb/s
      Nun, damit dein Script dies auch Intilligent ausführen kann und vielleicht noch eine von dir erstellte Funktion ausführt wenn Daten empfangen werden (zB. sie Verarbeiten wenn du verschlüsselte Nachrichten sendest), musst du dies alles in die eindlose schleife einbauen.

      Also das sieht dann so aus :

      Quellcode

      1. While 1
      2. $NewSocket = TCPAccept($MainSocket)
      3. If $NewSocket >= 0 Then
      4. Do
      5. $Recv = TCPRecv($NewSocket,2048)
      6. ;er empfängt daten von dem $NewSocket also neu angenommenen Verbindungen
      7. ;er empfängt die Nachrichten (egal ob Daten oder sonst was) mit bis zu 2048kb/s
      8. Until $Recv <> ""
      9. ;er empfängt daten bis er was empfangen hat das nicht "" ist, sprich das nicht gar nix ist
      10. ConsoleWrite("Empfangen : " & $Recv)
      11. ;hier könntest du noch deine eigenen Funktionen einbauen, die Daten sind in $Recv drin.
      12. EndIf
      13. WEnd
      Alles anzeigen
      Also ihr seht es geht ganz einfach und ihr könnt damit kleine update Tools, minigame wie pennergame oder so, chat-sys, daten-transfer proggy, sowas wie teamviewer ^^, usw. erstellen.


      CLIENT

      Als erstes,
      neben der MyFirstServer.au3 eine neue .au3 Datei erstellen.
      Du nennst sie "MyFirstClient.au3" .
      Dann öffnest du sie wie bei dem Server,

      Dann, als erstes benötigst du ein Include:

      Quellcode

      1. #include <GuiConstants.au3>
      In der GuiConstants.au3 sind verschiedene Variablen deklariert (benannt).
      Eigentlich benötigst du nur eine Dieser Variablen^^...
      Aber nimm einfach das Include.

      Danach als nächstes, schreibst du den ersten TCP-Befehl rein:

      Quellcode

      1. TCPStartUp()
      Dazu hab ich ja oben auch was geschrieben.

      Dann benötigst du ein GUI - Graphical User Interface (Bei dem Server hast du ein CUI - Console User Inferface benutzt)

      Quellcode

      1. $GUI = GuiCreate("MeinErsterClient",300,500)
      2. ;Dieses GUI hat folgende Größenwerte : 300x500
      3. ;Also 300 - Breit und 500 - Hoch
      4. [code]
      5. Zu dem GUI benötigst du noch ein Textfeld, und einen Button mit dem das Senden ausgelöst wird.
      6. [code]
      7. $Edit = GUICtrlCreateEdit("",0,0,300,200)
      8. ;Das Editfeld klebt an den Kanten des Fensters
      9. ;Und ist auch so breit wie das Fenster
      10. $OK = GUICtrlCreateButton("Senden",100,300,100,30)
      11. ;Auf diesem Button steht danach : Senden
      12. ;Der Button Hat folgende Position : 100│300 (x 100 & y 300)
      13. ;Der Button hat folgende Größenwerte : 100x30
      Alles anzeigen
      Damit alles angezeigt wird,
      wird ein kleiner aber wichtiger Befehl benötigt.

      Quellcode

      1. GUISetState()
      2. ;sorgt dafür, dass das GUI das als letztes deklariert wurde nächsten ist
      3. ;angezeigt wird.
      Und damit dein Fenster, nicht gleich nachdem es geöffnet wurde, wieder ausgeht:

      Quellcode

      1. While 1
      2. ;eine Endlose Schleife
      3. Wend
      Jetzt wird alles in deinem Fenster angezeigt,
      nur es passiert nichts wenn du auf "Send" klickst,
      und das Fenster schließt sich auch nicht.

      Dafür musst du die ganzen Funktionen in den Script einbauen,
      am besten in die endlose Schleife.
      Und jetzt wird auch endlich mal eine Variable aus dem Include benutzt.
      Diese Variable heißt "$GUI_EVENT_CLOSE"

      Quellcode

      1. While 1
      2. $msg = GUIGetMsg()
      3. ; sorgt dafür, dass dein Script merkt
      4. ;wenn irgendwas angeklickt/ausgewählt wurde.
      5. Switch $msg
      6. ;damit du nicht immer vor case "$msg setzen musst
      7. Case $OK
      8. $MainSocket = TCPConnect("127.0.0.1","3000")
      9. ;Verbindet mit dem Server
      10. ;der unter der IP 127.0.0.1 (localhost)
      11. ;und unter dem PORT 3000 läuft
      12. TCPSend($MainSocket,GUICtrlRead($Edit))
      13. ;Sendet den Text im Textfeld an den Server
      14. MsgBox(0,"GESENDET","Die Nachricht wurde gesendet")
      15. WEnd
      Alles anzeigen
      Und das war auch schon ein Client der Daten sendet (aber keine empfängt )
      Damit euer Client Daten empfängt könnt ihr ja einen mix aus dem Server und dem Client machen.
      Das ist nicht so schwer.
      Und außerdem merkt euer Script nicht wenn ein Fehler beim Senden auftritt,
      dass könnt ihr bestimmt auch selber einfügen.


      >>DATEIEN SENDEN

      Ich mach jetzt einfach den Code direkt rein


      C-Quellcode

      1. #cs ----------------------------------------------------------------------------
      2. AutoIt Version: 3.3.0.0
      3. Author: Jiyan Akgül --> Bitte so lassen
      4. Moddet by : Dein Name <<-- Dein Name
      5. Script Function:
      6. <>--Data Send Server--<>
      7. #ce ----------------------------------------------------------------------------
      8. ; Script Start -
      9. #cs
      10. Das müsst ihr dann in den script einbauan und anpassen
      11. #ce
      12. ;==== SERVER ====;
      13. #include <INet.au3>
      14. TCPStartup()
      15. Global $IP = _GetIP() ; ermittelt über DynDNS die IP
      16. Global $PORT = 4949
      17. Global $MaxLen = 2048 ;Maximale Speed die benutzt werden darf (ACHTUNG: BENUTZT BEI ZU VIEL DIE GANZE LEITUNG)
      18. $MainSocket = TCPListen($IP, $PORT, 1)
      19. MsgBox(64, "INFO", "Es gibt folgende DreiSchritte:" & @CR & "1.Datei Auswählen" & @CR & "2.Verbindung zum Cient herstellen" & @CR & "3.Datei senden")
      20. $File = FileOpenDialog("Bitte wählen sie die Datei aus", @DesktopDir, "All (*.*)")
      21. Do
      22. $NewSocket = TCPAccept($MainSocket)
      23. Until $NewSocket >= 0
      24. TCPSend($NewSocket, "0x" & StringToBinary("DATEI"))
      25. TCPSend($NewSocket, "0x" & Hex(StringLen(FileGetLongName($File))) & StringToBinary(FileGetLongName($File)))
      26. TCPSend($NewSocket, "0x" & Hex(FileGetSize($File)))
      27. Do
      28. $get = TCPRecv($NewSocket, $MaxLen)
      29. Until $get <> ""
      30. If $get = "0x"&Hex(2)&BinaryToString("OK") Then
      31. MsgBox(64,"INFO","Datei wurde von Gegenstelle angenommen")
      32. TCPSend($NewSocket,$File)
      33. MsgBox(64,"INFO","Die Datei wurde gesendet")
      34. ElseIf $get = "0x"&Hex(2)&BinaryToString("NO") Then
      35. MsgBox(64,"INFO","Datei wurde von Gegenstelle angenommen")
      36. TCPCloseSocket($NewSocket)
      37. TCPCloseSocket($MainSocket)
      38. TCPShutdown()
      39. Exit
      40. EndIf
      Alles anzeigen

      Brainfuck-Quellcode

      1. #cs ----------------------------------------------------------------------------
      2. AutoIt Version: 3.3.0.0
      3. Author: Jiyan Akgül --> Bitte so lassen
      4. Moddet by : Dein Name <<-- Dein Name
      5. Script Function:
      6. <>--Data Send Server--<>
      7. #ce ----------------------------------------------------------------------------
      8. ; Script Start -
      9. #cs
      10. Das müsst ihr dann in den script einbauan und anpassen
      11. #ce
      12. ;==== CLIENT ====;
      13. Global $IP = IniRead(@ScriptDir & "\options.ini", "Connection", "IP", "127.0.0.1") ;IP wird aus der ini gelesen
      14. Global $Port = IniRead(@ScriptDir & "\options.ini", "Connection", "Port", "4949") ;Port wird aus der ini gelesen
      15. Global $MaxLen = IniRead(@ScriptDir & "\options.ini", "Connection", "MaxLen", "2048") ;Maximale Bitrate wird aus der ini gelesen
      16. TCPStartup()
      17. $Connect = MsgBox(0x21, "INFO", "Mit Server verbinden?")
      18. If $Connect = 2 Then
      19. TCPShutdown()
      20. Exit
      21. EndIf
      22. MsgBox(0x40, "INFO", "Verbinde nun mit Server")
      23. _connect()
      24. Func _connect()
      25. $MainSocket = TCPConnect($IP, $Port)
      26. If $MainSocket = @error Then
      27. $Error = MsgBox(0x15,"ERROR","Konnte nicht mit Server verbinden."&@CR&"Bitte überprüfen Sie die Einstellungen."&@CR&"Noch einmal versuchen?")
      28. if $Error = 2 Then
      29. TCPCloseSocket($MainSocket)
      30. TCPShutdown()
      31. Exit
      32. ElseIf $Error = 4
      33. TCPCloseSocket($MainSocket)
      34. _connect()
      35. EndIf
      36. EndIf
      37. Do
      38. $get = TCPRecv($MainSocket,$MaxLen)
      39. Until $get <> ""
      40. Do
      41. $get_FileName = TCPRecv($MainSocket,$MaxLen)
      42. Until $get_FileName <> ""
      43. $FileName = BinaryToString(StringRight($get_FileName,Dec(StringLeft($get_FileName,10))))
      44. Do
      45. $get_FileSize = TCPRecv($MainSocket,$MaxLen)
      46. Until $get_FileSize <> ""
      47. $FileSize = Dec(StringLeft($get_FileSize,10))
      48. If $get = "0x" & StringToBinary("DATEI") Then
      49. $yes_no = MsgBox(0x44,"INFO","Der Server möchte eine Datei senden."&@CR&"Name : "&$FileName&@CR&"Größe : "&$FileSize&@CR&"Annehmen?")
      50. if $yes_no = 6 Then
      51. TCPSend($MainSocket,"0x"&Hex(2)&BinaryToString("OK"))
      52. $File = FileSaveDialog("Datei speichern als",@DesktopDir,"Alle (*.*)")
      53. $open = FileOpen($File,2)
      54. FileWrite($open,TCPRecv($MainSocket,$MaxLen))
      55. FileClose($open)
      56. MsgBox(0x40,"INFO","Datei wurde empfangen")
      57. Run("explorer.exe /"&StringReplace($File,$FileName,""))
      58. ElseIf $yes_no = 7 Then
      59. TCPSend($MainSocket,"0x"&Hex(2)&BinaryToString("NO")
      60. TCPCloseSocket($MainSocket)
      61. TCPShutdown()
      62. Exit
      63. EndIf
      64. EndIf
      65. EndFunc ;==>_connect
      Alles anzeigen



      gez :: *electriZer*


      (C) 2009-2012 by Jiyan Akgül

    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • @root
      dafür biste zu sehr ein noob(eine unerfahrene person)
      um zum flyff clienten zu connecten, musst du erstma ahnung haben über packets
      und dann musst du wissen, was du alles tun musst, um nen server zu machen
      also würde ich vorschlagen, du sammelst erstma erfahrung und dann machste weiter

      @TE
      ausser, dass es ein guter guide is, würde ich noch sagen:
      mach die _TCP.au3 rein
      is ja schliesslich auch was gutes
    • *electriZer*;16619 schrieb:

      also ersma digges THX an Explos!v für das Karma =D

      @root
      lern ersma mit sowas umzugehen, dann guck dir APSP II source an, wenne es checkst proggs weiter, ansonse lass liber ;)

      gez :: *electriZer*


      Läuft das Projekt eig noch?

      APSP ?
    • also das finde ich echt nich schön von kasoki
      dich einfach zu bannen und deinen guide wieder reinzutun
      echt mies
      der müsste nun auch verwarnt werden, wegen leechen
      das is sein geistiges eigentum und wirds auch bleiben
      wenn ichn buch schreibe und dann bei nem verlag rausgebe und später wechsel kann der alte verlag ja auch nich einfach mein buch weiter rausgeben ohne erlaubnis

      aber b2t

      wie gesagt, super guide
      hat sich alles verdient
      gl wird immer besser
      auf dass wir (du und ich) den au3 bereich verbessern