Function Reference


UDPRecv

Receives data from an opened socket.

UDPRecv ( socketarray, maxlen [, flag = 0] )

Parameters

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".

Return Value

Success: a binary/string sent by the opened socket or an array if flag = 2 or 3.
Failure: Empty string 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).

Remarks

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.

Related

BinaryLen, BinaryMid, UDPBind, UDPOpen, UDPSend

Example

#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 $idBtn_Server = GUICtrlCreateButton("1. Server", 65, 10, 130, 22)

    Local $idBtn_Client = GUICtrlCreateButton("2. Client", 65, 40, 130, 22)

    GUISetState(@SW_SHOW, $hGUI)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idBtn_Server
                WinSetTitle($sTitle, "", "UDP Server started")
                GUICtrlSetState($idBtn_Client, $GUI_HIDE)
                GUICtrlSetState($idBtn_Server, $GUI_DISABLE)
                If Not MyUDP_Server($sIPAddress, $iPort) Then ExitLoop
            Case $idBtn_Client
                WinSetTitle($sTitle, "", "UDP Client started")
                GUICtrlSetState($idBtn_Server, $GUI_HIDE)
                GUICtrlSetState($idBtn_Client, $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