Functions > Network >


TCPSend

Envoie des données à un socket connecté.

TCPSend ( mainsocket, data )

Paramètres

mainsocket L'ID du socket connecté (SocketID) tel que retourné par la fonction TCPConnect.
data Chaine ou binaire à envoyer au socket connecté.

Valeur de retour

Succès: Retourne le nombre d'octets envoyés au socket connecté.
Échec: Retourne 0 et définit @error <> 0.
@error: Valeur retournée par l'API windows WSAGetError (Consultez MSDN).

Remarque

Si des chaînes Unicode doivent être envoyées, elles doivent être encodées/décodées avec StringToBinary()/BinaryToString().

En relation

StringToBinary, TCPConnect, TCPListen, TCPRecv, 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 & "Connecxion impossible, 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 dans la file d'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 & "Ecoute impossible,  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ésentes (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), "", "Server:" & @CRLF & "Connexion entrante impossible, 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 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, "", "Serveur:" & @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 serveur, démmarez-moi d'abord! (Commencez par l'exemple 2 de la fonction TCPRecv).

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

Example()

Func Example()
    ; Assigne une variable locale avec le chemin d'un fichier choisi par une boîte de dialogue.
    Local $sFilePath = FileOpenDialog("Choisir un fichier à envoyer", @MyDocumentsDir, "All types (*.*)", BitOR($FD_FILEMUSTEXIST, $FD_PATHMUSTEXIST))
    Local $iError = 0

    ; Remarque: Choisissez un fichier de plus de 4 Ko sinon le premier exemple est suffisant.

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

    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 à l'adresse IP et au port spécifié avec un maximum de 100 connexions dans la file d'attente.
    Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)

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

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

    Do ; Attend que quelqu'un se connecte (illimité).
        ; Accepte des connexions entrantes si présentes (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), "", "Server:" & @CRLF & "Connexion entrante impossible, code de l'erreur: " & $iError)
            Return False
        EndIf
    Until $iSocket <> -1 ; si différent de -1 le client est connecté.

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

    ; Assigne une variable locale avec la taille du fichier précédemment choisi.
    Local $iFileSize = FileGetSize($sFilePath)

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

    ; Assigne une variable locale avec l'offset du fichier en cours de lecture.
    Local $iOffset = 0

    ; Assigne une variable locale avec le nombre représentant 4 Ko.
    Local Const $i4KiB = 4096

    ; Remarque: Le fichier est envoyé par parties de 4 Ko.

    ; Envoie les données binaires du fichier sur le serveur.
    Do
        ; Définit la position du fichier à l'offset courant.
        FileSetPos($hFile, $iOffset, $FILE_BEGIN)

        ; Le fichier est lu à partir de la position définie à 4 Ko et directement enveloppé dans la fonction TCPSend.
        TCPSend($iSocket, FileRead($hFile, $i4KiB))

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

            ; Ferme le socket.
            TCPCloseSocket($iSocket)
            Return False
        EndIf

        ; Incrémente l'offset de 4 Ko pour envoyer les 4 prochains Ko de données.
        $iOffset += $i4KiB
    Until $iOffset >= $iFileSize

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

    ; Dit au client que le fichier est complètement envoyé avec un code.
    TCPSend($iSocket, @CRLF & "{EOF}")

    ; Affiche un message de succès.
    MsgBox($MB_SYSTEMMODAL, "", "Serveur:" & @CRLF & "Fichier envoyé.")

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

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