• Gute Tag liebe AutoIt.de Gemeinde,
    da anscheinend viele Probleme mit dem UDP-Protokoll haben, hab ich mich dazu entschlossen ein kleines Tutorial zu schreiben.
    Ich werde hier nicht auf die Unterschiede zwischen UDP und TCP im Speziellen eingehen und wann was verwendet wird. Dafür ist Google dein Freund.
    Zuerst einmal die UDP-Befehle im Überblick und die entsprechenden TCPBefehle in Klammern:

    [autoit]

    UDPStartup() ;startet den UDP-Service (TCPStartup())
    UDPBind() ; erzeugt einen Socket (TCPAccept())
    UDPOpen() ; verbindet sich mit einem Socket (TCPConnect())
    UDPRecv() ; empfängt Daten vom offenen Socket (TCPRecv())
    UDPSend() ; sendet Daten an einen offenen Socket (TCPSend())
    UDPCloseSocket() ; schließt einen Socket (TCPCloseSocket())
    UDPShutdown() ; stoppt den UDP-Service (TCPShutdown())

    [/autoit]


    Man sieht sehr schnell, dass das UDP-Protokoll sehr viele Ähnlichkeiten mit dem TCP-Protokoll hat, es hat aber auch seine Schwierigkeiten.
    Um mit den UDP-Befehlen etwas besser umgehen zu können, werden wir einen sehr einfachen Client und einen Server schreiben. Der Client sendet dem Server einen Befehl, worauf dieser etwas durch den gleichen (!!) Socket zurückschickt. Genau darin liegt nämlich die Schwierigkeit, da die UDP-Befehle doch etwas anders aufgebaut sind, als die TCP-Befehle, aber das werdet ihr gleich selber sehen.
    Zuersteinmal schreiben wir unseren Client. Zuerst einmal müssen wir immer UDPStartup() verwenden, bevor wir die anderen UDP-Befehle verwenden, der Rest sollte durch die Kommentare klar werden.
    Client:

    Spoiler anzeigen
    [autoit]

    $g_IP = "127.0.0.1" ; IP-Addresse des Servers, in dem Fall localhost

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

    UDPStartup() ;startet den UDP-Service

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

    $aSocket = UDPOpen($g_IP, 65432) ; verbindet sich mit dem offenen Socket des Servers mit der IP $g_IP und dem Port 65432
    ; $aSocket ist ein Array das wie folgt aufgebaut ist:
    ; $aSocket[1]: real socket
    ; $aSocket[2]: IP des Servers
    ; $aSocket[3]: Port des Servers

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

    If @error Then
    MsgBox(48, "Error", "Es kann keine Verbindung zum Server hergestellt werden!")
    Exit
    EndIf

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

    $sText = InputBox("Client->Server", "Was möchten sie an den Server senden?")

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

    UDPSend($aSocket, $sText); Sendet den Inhalt der InputBox an den Server

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

    Do ; Wird solange durchlaufen bis etwas vom Server empfangen wird
    Local $sData = UDPRecv($aSocket, 128)
    Sleep(100)
    Until $sData <> ""

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

    MsgBox(0, "CLIENT", "Daten vom Server empfangen: "&@CRLF&$sData) ; Ausgabe der empfangenen Daten

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

    UDPShutdown()

    [/autoit]


    Aber bevor wir den Client starten können, müssen wir natürlich erst den Server starten, den wir im Folgenden schreiben werden.
    Server:

    Spoiler anzeigen
    [autoit]

    OnAutoItExitRegister("_exit")

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

    $g_IP = "127.0.0.1" ; eigene IP-Addresse

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

    UDPStartup() ;startet den UDP-Service

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

    $aSocket = UDPBind($g_IP, 65432) ; Öffnet einen Socket mit der IP $g_IP und dem Port 65432
    ; $aSocket ist genauso aufgebaut wie das Array von UDPOpen()
    ; $aSocket[1]: real socket
    ; $aSocket[2]: IP des Servers
    ; $aSocket[3]: Port des Servers
    If @error Then Exit
    While 1
    $aData = UDPRecv($aSocket, 128, 2) ;empfängt Daten von einem Client
    ;durch das Flag 2 wird folgendes Array ausgegeben:
    ; $aData[0]: data
    ; $aData[1]: IP des Clients
    ; $aData[2]: Port des Clients

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

    If $aData <> "" Then ; wenn Daten empfangen werden
    MsgBox(0, "SERVER", "Daten vom Client erhalten:"&@CRLF&$aData[0]) ; Ausgabe der empfangenen Daten

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

    #cs
    Die Schwierigkeit liegt nun darin, die Daten durch den gleichen Socket
    zurück zum Client zu schicken, da das Array von UDPRecv anders aufgebaut
    ist, als es UDPSend() benötigt.
    Wir müssen uns also selber ein Array aus den vorhandenen Informationen zusammenschreiben:
    $aClientArray[0] = $aSocket[0]
    $aClientArray[1] = $aSocket[1]
    $aClientArray[2] = $aData[1]
    $aClientarray[3] = $aData[2]
    #ce
    Local $aClientArray[4] = [$aSocket[0], $aSocket[1], $aData[1], $aData[2]]

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

    UDPSend($aClientarray, $aData[0]) ; Sendet die gleichen Daten zurück an den Client
    EndIf
    Sleep(100)
    WEnd

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

    Func _exit() ; nur um sicherzustellen, dass das UDP-Protokoll auch wirklich beendet wird
    UDPShutdown()
    EndFunc

    [/autoit]


    Wie ihr seht, bringen die UDP-Befehle einige Schierigkeiten mit sich. Meine Hauptintension war es, zu zeigen, wie man mit dem Server über den gleichen Socket Daten zurück an den Client schicken kann, was mit TCP weitaus einfacher ist.
    Wenn ihr Fragen oder Kritik habt, postet es einfach hier drunter.

    mfg K4z

    Zitat

    You just keep on trying 'till you run out of cake. ;)


    [STEAM] Source UDF

    2 Mal editiert, zuletzt von K4z (22. August 2012 um 22:12)

  • Finde ich super ;D...

    Aber geh mal auf die Unterschiede zwischen UDP und TCP ein, wann/für was sollte man was nutzen, was sind die Stärken/Schwächen (Antwort/Geschwindigkeit, etc...).

    LG,
    Aca

  • is es nicht eigentlich einfacher? da man nicht mit 2 ports & Verbindungen arbeiten muss
    für z.B ein einfachen Chat zwischen 2 pc´s

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Zitat

    is es nicht eigentlich einfacher? da man nicht mit 2 ports & Verbindungen arbeiten muss


    Wie meinst du das? :huh:
    UDP funktioniert fast genau gleich wie TCP. Der Hauptunterschied ist die fehlende Sicherung bei der Datenübertragung die in vielen Fällen Geschwindigkeitsvorteile bringt.

  • [autoit]

    $aData = UDPRecv($aSocket, 128, 2) ;empfängt Daten von einem Client
    ;durch das Flag 2 wird folgendes Array ausgegeben:
    ; $aSocket[0]: data
    ; $aSocket[1]: IP des Clients
    ; $aSocket[2]: Port des Clients

    [/autoit]

    Sollte es hier im Kommentar nicht $aData statt $aSocket heissen?