Erhält Daten von einem geöffneten "Socket".
UDPRecv ( socketarray, maxlen [, flag = 0] )
socketarray | Der Socket/das Array, wie von der Funktion UDPBind() zurückgegeben. |
maxlen | Maximale Anzahl der zu erhaltenen Zeichen. |
flag | [optional] UDP_DATA_DEFAULT (0) - ermittelt automatisch binär oder String. UDP_DATA_BINARY (1) - Rückgabe von Binärdaten $UDP_DATA_ARRAY (2) - Rückgabe als Array: [0] Daten, [1] Server-IP, [2] Server-Port. Wird beides benötigt, so ist 3 zu verwenden. Die Konstanten sind in "AutoItConstants.au3" definiert. |
Erfolg: | Binärdaten bzw. ein String, die vom geöffneten "Socket" gesendet wurde oder eine Array falls "flag" = 2 oder 3. |
Fehler: | "" und setzt das @error Flag auf ungleich null. |
@error: | -1 ungültiges Socket. -2 nicht verbunden, -3 oder -4 ungültiges Socketarray. Windows API WSAGetLastError Rückgabewerte (siehe MSDN). |
Aus Gründen der Abwärtskompatibilität versucht diese Funktion standardmäßig Strings zurückzugeben. Falls Nullzeichen (0x00) empfangen werden, ist der Rückgabewert binär.
Um von der Funktion die Rückgabe von Binärdaten zu erzwingen (die meist sinnvolle Option), ist der "flag"-Parameter auf 1 zu setzen.
BinaryLen, BinaryMid, UDPBind, UDPOpen, UDPSend
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
; Zum starten zuerst auf "1. Server" klicken
; Dann durch "2. Client" eine zweite Instanz des Skripts starten
Example()
Func Example()
UDPStartup() ; Startt den UDP Service.
; Registriert OnAutoItExit um es aufzurufen, wenn das Script beendet wird.
OnAutoItExitRegister("OnAutoItExit")
; Weist lokalen Variablen die loopback IP-Adresse (localhost) und den Port zu.
Local $sIPAddress = "127.0.0.1" ; Diese IP-Adresse funktioniert nur am eigenen Computer.
Local $iPort = 65532 ; Port welcher für die Verbindung verwendet wird.
#Region GUI
Local $sTitle = "TCP Start"
Local $hGUI = GUICreate("TCPSend", 250, 70)
Local $idBtnServer = GUICtrlCreateButton("1. Server", 10, 10, 130, 22)
Local $idBtnClient = GUICtrlCreateButton("2. Client", 10, 40, 130, 22)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtnServer
WinSetTitle($sTitle, "", "TCP Server gestarted")
GUICtrlSetState($idBtnClient, $GUI_HIDE)
GUICtrlSetState($idBtnServer, $GUI_DISABLE)
If Not MyUDP_Server($sIPAddress, $iPort) Then ExitLoop
Case $idBtnClient
WinSetTitle($sTitle, "", "TCP Client gestarted")
GUICtrlSetState($idBtnServer, $GUI_HIDE)
GUICtrlSetState($idBtnClient, $GUI_DISABLE)
If Not MyUDP_Client($sIPAddress, $iPort) Then ExitLoop
EndSwitch
Sleep(10)
WEnd
#EndRegion GUI
EndFunc ;==>Example
Func MyUDP_Server($sIPAddress, $iPort)
; Weist einer lokalen Variable den Socket zu und bindet die angegebene IP-Adresse und Port.
Local $iSocket = UDPBind($sIPAddress, $iPort)
; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
If @error Then
; Vielleicht lauscht bereits jemand auf dieser IP-Adresse und dem Port (läuft das Script bereits?).
Local $iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Server:" & @CRLF & "Konnte nicht lauschen, Error Code: " & $iError)
Return False
EndIf
; Initialisiert eine lokale Variable um die empfangenen Daten abzuspeichern.
Local $sReceived = ""
Do
; Es wird auf den String "tata" oder "toto" gewartet (Beispielscript UDPSend): 4 Bytes lang.
$sReceived = UDPRecv($iSocket, 4)
Until $sReceived <> ""
; Hinweis: Wenn man nicht weiß groß die ankommenden Daten sein werden, so kann man als Beispiel 2048 als maxlen-Parameter verwenden
; und die Funktion solange aufrufen, bis sie nichts bzw. einen Error zurückgibt.
; Zeigt den empfangenen String an.
MsgBox($MB_SYSTEMMODAL, "", "Server:" & @CRLF & "Empfangen: " & $sReceived)
; Schließt den Socket.
UDPCloseSocket($iSocket)
EndFunc ;==>MyUDP_Server
Func MyUDP_Client($sIPAddress, $iPort)
; Weist einer lokalen Variable den Socket zu und verbindet sich zu einem lauschenden Socket mit der angegebenen IP-Adresse und Port.
Local $iSocket = UDPOpen($sIPAddress, $iPort)
Local $iError = 0
; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
If @error Then
; Der Server ist vermutlich offline oder der Port wurde nicht am Server geöffnet.
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Client:" & @CRLF & "Verbindung konnte nicht hergestellt werden, Error Code: " & $iError)
Return False
EndIf
; Sendet den String "toto" konvertiert in die Binärrepräsentation zum Server.
UDPSend($iSocket, StringToBinary("toto"))
; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
If @error Then
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Client:" & @CRLF & "Daten konnten nicht gesendet werden, Error Code: " & $iError)
Return False
EndIf
; Schließt den Socket.
UDPCloseSocket($iSocket)
EndFunc ;==>MyUDP_Client
Func OnAutoItExit()
UDPShutdown() ; Schließt den UDP Service.
EndFunc ;==>OnAutoItExit