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:
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())
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
$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
If @error Then
MsgBox(48, "Error", "Es kann keine Verbindung zum Server hergestellt werden!")
Exit
EndIf
$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 <> ""
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
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
If $aData <> "" Then ; wenn Daten empfangen werden
MsgBox(0, "SERVER", "Daten vom Client erhalten:"&@CRLF&$aData[0]) ; Ausgabe der empfangenen Daten
#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]]
UDPSend($aClientarray, $aData[0]) ; Sendet die gleichen Daten zurück an den Client
EndIf
Sleep(100)
WEnd
Func _exit() ; nur um sicherzustellen, dass das UDP-Protokoll auch wirklich beendet wird
UDPShutdown()
EndFunc
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