Reçoit des données d'un socket connecté.
TCPRecv ( mainsocket, maxlen [, flag = 0] )
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". |
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. |
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().
BinaryLen, BinaryMid, BinaryToString, TCPAccept, TCPConnect, TCPSend, TCPStartup, TCPTimeout (Option)
#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
; 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