Functions > Network >


TCPRecv

Re�oit des donn�es d'un socket connect�.

TCPRecv ( mainsocket, maxlen [, flag = 0] )

Param�tres

mainsocket L'ID du socket principal (SocketID) tel que retourn� par un appel � la fonction TCPAccept ou TCPConnect.
maxlen Nombre maximum de caract�res � recevoir.
flag [optionnel] Si flag=1, force la fonction � retourner les donn�es en binaire (0 par d�faut, et d�tectera automatiquement entre binaire et string).
    $TCP_DATA_DEFAULT (0) - (par d�faut) d�tecte automatiquement binaire/cha�ne
    $TCP_DATA_BINARY (1) - retourne les donn�es sous forme binaire

Les constantes sont d�fines dans "AutoItConstants.au3".

Valeur de retour

Succ�s: Retourne les donn�es binaire/cha�ne envoy�es par le socket connect�.
�chec: Retourne "" et d�finit @error <> 0.
@error: -1 : Socket invalide.
-2 : pas de connexion.
Valeur retourn�e par l'API windows WSAGetError (Consultez MSDN).
@extended: 1 : aucun octet re�u.

Remarques

Pour des raisons de r�tro-compatibilit�, cette fonction essayera de retourner une cha�ne par d�faut. Si un caract�re null (0x00) est re�u alors la valeur de retour sera de type binaire.
Pour forcer la fonction � retourner toujours des donn�es binaires (l'option la plus logique) alors mettre le param�tre "flag" � 1.

Si vous avez besoin de transmettre des cha�nes Unicode, elles doivent �tre encod�es/d�cod�es avec StringToBinary()/BinaryToString().

En relation

BinaryLen, BinaryMid, BinaryToString, TCPAccept, TCPConnect, TCPSend, TCPStartup, TCPTimeout (Option)

Exemples

Exemple 1

#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()
    TCPStartup() ; D�marre le service TCP.

    ; 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 = 65432 ; Port utilis� pour la connexion.

    #Region GUI
    Local $sTitle = "TCP 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, "", "TCP Server started")
                GUICtrlSetState($idBtnClient, $GUI_HIDE)
                GUICtrlSetState($idBtnServer, $GUI_DISABLE)
                If Not MyTCP_Server($sIPAddress, $iPort) Then ExitLoop
            Case $idBtnClient
                WinSetTitle($sTitle, "", "TCP Client started")
                GUICtrlSetState($idBtnServer, $GUI_HIDE)
                GUICtrlSetState($idBtnClient, $GUI_DISABLE)
                If Not MyTCP_Client($sIPAddress, $iPort) Then ExitLoop
        EndSwitch

        Sleep(10)
        $iMsg = GUIGetMsg()
    WEnd

    #EndRegion GUI
EndFunc   ;==>Example

Func MyTCP_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 = TCPConnect($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 & "Pas de connexion,  code de l'erreur: " & $iError)
        Return False
    EndIf

    ; Envoie la cha�ne "tata" au serveur.
    TCPSend($iSocket, "tata")

    ; 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 de l'erreur: " & $iError)
        Return False
    EndIf

    ; Ferme le socket.
    TCPCloseSocket($iSocket)
EndFunc   ;==>MyTCP_Client

Func MyTCP_Server($sIPAddress, $iPort)
    ; Assigne une variable locale avec le socket et se connecte � l'adresse IP et au port sp�cifi� avec un maximum de 100 connexions en attente.
    Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)
    Local $iError = 0

    If @error Then
        ; Quelqu'un est probablement d�j� � l'�coute sur cette adresse IP et sur ce port (script d�j� en cours d'ex�ccution?).
        $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Server:" & @CRLF & "Impossible d'�couter, code de l'erreur: " & $iError)
        Return False
    EndIf

    ; Assigne une variable locale pour �tre utilis� par le socket client.
    Local $iSocket = 0

    Do ; Attend que quelqu'un se connecte (illimit�).
        ; Accepte les connexions entrantes si pr�sent (Socket ferm� une fois termin�, un socket par client).
        $iSocket = TCPAccept($iListenSocket)

        ; 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), "", "Serveur:" & @CRLF & "Ne peut pas accepter une connexion entrante, code de l'erreur: " & $iError)
            Return False
        EndIf

        If GUIGetMsg() = $GUI_EVENT_CLOSE Then Return False
    Until $iSocket <> -1 ; si diff�rent de -1, le client est connect�.

    ; Ferme le socket d'�coute pour permettre pour permettre une connexion ult�rieure.
    TCPCloseSocket($iListenSocket)

    ; Assigne une variable locale avec les donn�es re�ues.
    Local $sReceived = TCPRecv($iSocket, 4) ; nous attendons la cha�ne "tata" OU "toto" (exemple de script TCPRecv): 4 octets de longueur.

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

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

    ; Ferme le socket.
    TCPCloseSocket($iSocket)
EndFunc   ;==>MyTCP_Server

Func OnAutoItExit()
    TCPShutdown() ; Ferme le service TCP.
EndFunc   ;==>OnAutoItExit

Exemple 2

; Je suis le client, d�marrez-moi apr�s le serveur! (Commencez d'abord l'exemple 2 de la fonction TCPSend).

#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>

Example()

Func Example()
    TCPStartup() ; D�marre le service TCP.

    ; 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 = 65432 ; Port utilis� pour la connexion.

    ; 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 = TCPConnect($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 & "Connexion impossible, code de l'erreur: " & $iError)
        Return False
    EndIf

    ; Assigne une variable locale avec le chemin du fichier qui sera re�u.
    Local $sFilePath = FileSaveDialog("Save as", @MyDocumentsDir, "All types (*.*)", BitOR($FD_PATHMUSTEXIST, $FD_PROMPTOVERWRITE))

    ; Si une erreur s'est produite, affiche le code d'erreur et retourne Faux.
    If @error Then
        $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONEXCLAMATION), "", "Client:" & @CRLF & "Fichier choisi invalide, code de l'erreur: " & $iError)
        Return False
    EndIf

    ; Assigne une variable locale avec le handle du fichier ouvert en mode �crasement binaire.
    Local $hFile = FileOpen($sFilePath, BitOR($FO_BINARY, $FO_OVERWRITE))

    ; Assigne des constantes locales avec le nombre repr�sentant 4 Ko; le code binaire pour la fin du fichier, et la longueur du code binaire.
    Local Const $i4KiB = 4096, $bEOF = Binary(@CRLF & "{EOF}"), $iEOFLen = BinaryLen($bEOF)

    ; Assigne une variable locale avec les donn�es binaires vide qui contiendra les donn�es binaires du fichier.
    Local $bData = Binary("")

    ; Assigne une variable locale pour stocker la longueur des donn�es re�ues.
    Local $iDataLen = 0

    ; Assigne une variable locale avec un bool�en.
    Local $bEOFReached = False

    Do
        $bData = TCPRecv($iSocket, $i4KiB, 1)

        ; 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 & "Connexion perdue, code de l'erreur: " & $iError)
            Return False
        EndIf

        $iDataLen = BinaryLen($bData)

        ; Si rien n'est re�u, recommencez pour les donn�es entrantes.
        If $iDataLen = 0 Then ContinueLoop

        ; Si la fin du fichier est atteinte.
        If BinaryMid($bData, 1 + $iDataLen - $iEOFLen, $iEOFLen) = $bEOF Then
            ; Coupe le code de EOF dans le fichier des donn�es.
            $bData = BinaryMid($bData, 1, $iDataLen - $iEOFLen)

            ; D�finit EOFReached � True.
            $bEOFReached = True
        EndIf

        FileWrite($hFile, $bData)
    Until $bEOFReached

    ; Ferme Le handle du fichier.
    FileClose($hFile)

    ; Affiche le message de succ�s.
    MsgBox($MB_SYSTEMMODAL, "", "Client:" & @CRLF & "Fichier re�u.")

    ; Ferme le socket.
    TCPCloseSocket($iSocket)
EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown() ; Ferme le service TCP.
EndFunc   ;==>OnAutoItExit