Receives data from an opened socket.
UDPRecv ( socketarray, maxlen [, flag = 0] )
socketarray | The socket/array as returned by a UDPBind() function. |
maxlen | max # of characters to receive. |
flag | [optional] UDP_DATA_DEFAULT (0) - will auto detect between binary/string. UDP_DATA_BINARY (1) - return binary data $UDP_DATA_ARRAY (2) - returned in an Array : [0] data, [1] from IP, [2] from Port. If you want both just use 3. Constants are defined in "AutoItConstants.au3". |
Success: | a binary/string sent by the opened socket or an array if flag = 2 or 3. |
Failure: | "" and sets the @error flag to non-zero. |
@error: | -1 invalid socket. -2 not connected. -3 or -4 invalid socketarray. Windows API WSAGetLastError return value (see MSDN). |
For backwards compatibility reasons this function will try to return strings by default. If null (0x00) characters are received then the return value will be a binary type.
To force the function to always return binary data (the most sensible option) then use the "flag" parameter set to 1.
BinaryLen, BinaryMid, UDPBind, UDPOpen, UDPSend
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
; Start First clicking on "1. Server"
; Then start a second instance of the script selecting "2. Client"
Example()
Func Example()
UDPStartup() ; Start the UDP service.
; Register OnAutoItExit to be called when the script is closed.
OnAutoItExitRegister("OnAutoItExit")
; Assign Local variables the loopback IP Address and the Port.
Local $sIPAddress = "127.0.0.1" ; This IP Address only works for testing on your own computer.
Local $iPort = 65532 ; Port used for the connection.
#Region GUI
Local $sTitle = "UDP Start"
Local $hGUI = GUICreate($sTitle, 250, 70)
Local $idBtnServer = GUICtrlCreateButton("1. Server", 65, 10, 130, 22)
Local $idBtnClient = GUICtrlCreateButton("2. Client", 65, 40, 130, 22)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtnServer
WinSetTitle($sTitle, "", "UDP Server started")
GUICtrlSetState($idBtnClient, $GUI_HIDE)
GUICtrlSetState($idBtnServer, $GUI_DISABLE)
If Not MyUDP_Server($sIPAddress, $iPort) Then ExitLoop
Case $idBtnClient
WinSetTitle($sTitle, "", "UDP Client started")
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)
; Assign a Local variable the socket and bind to the IP Address and Port specified.
Local $iSocket = UDPBind($sIPAddress, $iPort)
; If an error occurred display the error code and return False.
If @error Then
; Someone is probably already binded on this IP Address and Port (script already running?).
Local $iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Server:" & @CRLF & "Could not bind, Error code: " & $iError)
Return False
EndIf
; Assign a Local variable to store the data received.
Local $sReceived = ""
Do
; We are waiting for the string "toto" OR "tata" (example script UDPSend): 4 bytes length.
$sReceived = UDPRecv($iSocket, 4)
Until $sReceived <> ""
; Notes: If you don't know how much length will be the data,
; use e.g: 2048 for maxlen parameter and call the function until the it returns nothing/error.
; Display the string received.
MsgBox($MB_SYSTEMMODAL, "", "Server:" & @CRLF & "Received: " & $sReceived)
; Close the socket.
UDPCloseSocket($iSocket)
EndFunc ;==>MyUDP_Server
Func MyUDP_Client($sIPAddress, $iPort)
; Assign a Local variable the socket and connect to a listening socket with the IP Address and Port specified.
Local $iSocket = UDPOpen($sIPAddress, $iPort)
Local $iError = 0
; If an error occurred display the error code and return False.
If @error Then
; The server is probably offline/port is not opened on the server.
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Client:" & @CRLF & "Could not connect, Error code: " & $iError)
Return False
EndIf
; Send the string "toto" converted to binary to the server.
UDPSend($iSocket, StringToBinary("toto"))
; If an error occurred display the error code and return False.
If @error Then
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Client:" & @CRLF & "Could not send the data, Error code: " & $iError)
Return False
EndIf
; Close the socket.
UDPCloseSocket($iSocket)
EndFunc ;==>MyUDP_Client
Func OnAutoItExit()
UDPShutdown() ; Close the UDP service.
EndFunc ;==>OnAutoItExit