Functions > Network >


UDPOpen

Ouvre un socket connecté à un serveur existant.

UDPOpen ( IPAddr, port [, flag = 0] )

Paramètres

IPAddr L'adresse IPv4 avec des points tel que: "192.162.1.1".
port Port sur lequel le socket créé sera connecté.
flag [optionnel]
    $UDP_OPEN_DEFAULT (0) = (par défaut) - Aucune option supplémentaire n'est définie.
    $UDP_OPEN_BROADCAST (1) = Autorise le broadcasting sur l'adresse "255.255.255.255".

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

Valeur de retour

Succès: Retourne le tableau suivant:
    [1] le socket réel
    [2] l'adresse IP spécifiée
    [3] le port.
Nous avons besoin de ces informations pour des appels ultérieurs à UDPSend(), où nous passons cette structure/tableau de socket.
Échec: Retourne 0 à la position [0] du tableau et définit @error <> 0.
@error: Valeur retournée par l'API Windows WSAGetError (consultez MSDN).

Remarque

Cette fonction est utilisée par un client pour communiquer avec le serveur.

En relation

UDPBind, UDPCloseSocket, UDPRecv, 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