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