Functions > Network >


UDPRecv

Reçoit des données d'un socket ouvert.

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

Paramètres

socketarray Le socket/array retourné par la fonction UDPBind().
maxlen Nombre maximum de caractères à recevoir.
flag [optionnel]     UDP_DATA_DEFAULT (0) - Détecte automatiquement entre binaire et chaîne).
    UDP_DATA_BINARY (1) - Retourne des données binaires.
    $UDP_DATA_ARRAY (2) - Retourne un tableau: [0]=données, [1]=IP, [2]=Port.
Si vous souhaitez les deux, mettez le paramètre à 3.

Les constantes sont définies dans "AutoItConstants.au3".

Valeur de retour

Succès: Retourne le binaire ou la chaîne envoyé par le socket ouvert ou un tableau si le paramètre flag est à 2 ou 3.
Échec: Retourne "" et définit @error <> 0.
@error: -1 : socket ou tableau invalide.
-2 : non connecté.
-3 ou -4 : socketarray invalide.
Valeur retournée par l'API Windows WSAGetError (Consultez MSDN).

Remarque

Pour des raisons de rétro-compatibilité, cette fonction essayera de retourner des chaînes par défaut. Si un caractère nul (0x00) est reçu, alors la valeur retournée sera de type binaire.
Pour forcer la fonction à toujours retourner des données binaires (l'option la plus sensible) mettez le paramètre "flag" à 1.

En relation

BinaryLen, BinaryMid, UDPBind, UDPOpen, UDPSend

Exemple

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

; Commencez d'abord par cliquer sur "1. Serveur"
; Puis démarrez une seconde instance du script en sélectionnant "2. Client"

Example()

Func Example()
    UDPStartup() ; Démarre le service UDP.

    ; Enregistre OnAutoItExit qui sera appelée lorsque le script se fermera.
    OnAutoItExitRegister("OnAutoItExit")

    ; Assigne des variables locales avec l'adresse IP et le port.
    Local $sIPAddress = "127.0.0.1" ; Cette adresse IP ne fonctionne que pour les tests sur votre propre ordinateur.
    Local $iPort = 65532 ; Port utilisé pour la connexion.

    #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)

    Local $iMsg = GUIGetMsg()
    While $iMsg <> $GUI_EVENT_CLOSE
        Switch $iMsg
            Case $idBtnServer
                WinSetTitle($sTitle, "", "Serveur UDP démarré")
                GUICtrlSetState($idBtnClient, $GUI_HIDE)
                GUICtrlSetState($idBtnServer, $GUI_DISABLE)
                If Not MyUDP_Server($sIPAddress, $iPort) Then ExitLoop
            Case $idBtnClient
                WinSetTitle($sTitle, "", "Client UDP démarré")
                GUICtrlSetState($idBtnServer, $GUI_HIDE)
                GUICtrlSetState($idBtnClient, $GUI_DISABLE)
                If Not MyUDP_Client($sIPAddress, $iPort) Then ExitLoop
        EndSwitch

        Sleep(10)
        $iMsg = GUIGetMsg()  
    WEnd

    #EndRegion GUI
EndFunc   ;==>Example

Func MyUDP_Server($sIPAddress, $iPort)
    ; Assigne une variable locale avec le socket et se connecte à l'adresse IP et au port spécifié.
    Local $iSocket = UDPBind($sIPAddress, $iPort)

    ; Si une erreur s'est produite, affiche le code d'erreur et retourne False.
    If @error Then
        ; Quelqu'un est probablement déjà connecté sur cette adresse IP et ce port (script déjà en cours d"exécution?).
        Local $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Server:" & @CRLF & "Impossible d'établir la liaison, code d'erreur: " & $iError)
        Return False
    EndIf

    ; Assigne une variable locale pour stocker les données reçues.
    Local $sReceived = ""

    Do
        ; Nous attendons la chaîne "toto" OU "tata" (exemple de script UDPSend) : 4 octets de longueur.
        $sReceived = UDPRecv($iSocket, 4)
    Until $sReceived <> ""

    ; Notes: Si vous ne savez pas de quelle longueur seront les données,
    ; utilisez, par exemple: 2048 pour paramètre maxlen et appelez la fonction jusqu'à ce qu'elle ne retourne rien ou erreur.

    ; Affiche la chaîne reçue.
    MsgBox($MB_SYSTEMMODAL, "", "Server:" & @CRLF & "Reçu: " & $sReceived)

    ; Ferme le socket.
    UDPCloseSocket($iSocket)
EndFunc   ;==>MyUDP_Server

Func MyUDP_Client($sIPAddress, $iPort)
    ; Assigne une variable locale avec le socket et se connecte à un socket d'écoute avec l'adresse IP et le port spécifié.
    Local $iSocket = UDPOpen($sIPAddress, $iPort)
    Local $iError = 0

    ; Si une erreur s'est produite, affiche le code d'erreur et retourne False.
    If @error Then
        ; Le serveur est probablement hors ligne ou le port n'est pas ouvert sur le serveur.
        $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Client:" & @CRLF & "Impossible de se connecter, code d'erreur: " & $iError)
        Return False
    EndIf

    ; Envoie la chaîne "toto" convertie en binaire sur le serveur.
    UDPSend($iSocket, StringToBinary("toto"))

    ;Si une erreur s'est produite, affiche le code d'erreur et retourne False.
    If @error Then
        $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Client:" & @CRLF & "Impossible d'envoyer des données, code d'erreur: " & $iError)
        Return False
    EndIf

    ; Ferme le socket.
    UDPCloseSocket($iSocket)
EndFunc   ;==>MyUDP_Client

Func OnAutoItExit()
    UDPShutdown() ; Ferme le service UDP.
EndFunc   ;==>OnAutoItExit