Envoie des donn�es � un socket connect�.
TCPSend ( mainsocket, data )
mainsocket | L'ID du socket connect� (SocketID) tel que retourn� par la fonction TCPConnect. |
data | Chaine ou binaire � envoyer au socket connect�. |
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). |
StringToBinary, TCPConnect, TCPListen, TCPRecv, 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 & "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
; 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