Receives data from a connected socket.
TCPRecv ( mainsocket, maxlen [, flag = 0] )
mainsocket | The connected socket identifier (SocketID) as returned by a TCPAccept() or a TCPConnect() function. |
maxlen | max # of characters to receive. |
flag | [optional] Forces the function to return binary data if set to 1 (default is 0, and will auto detect between binary/string). $TCP_DATA_DEFAULT (0) - (Default) will auto detect between binary/string $TCP_DATA_BINARY (1) - return binary data Constants are defined in "AutoItConstants.au3". |
Success: | the binary/string sent by the connected socket. See remark. |
Failure: | "" and sets the @error flag to non-zero. |
@error: | -1 invalid socket. -2 not connected. Windows API WSAGetLastError return value (see MSDN). |
@extended: | 1 no byte received. |
For backwards compatibility reasons this function will try to return strings by default. If null (0x00) characters are received then the return value will be a binary type.
To force the function to always return binary data (the most sensible option) then use the "flag" parameter set to 1.
If Unicode strings need to be transmitted they must be encoded/decoded with StringToBinary()/BinaryToString().
When there is no more data to receive the return value is "" and @extended = 1.
A test of TCPSend() and TCPRecv() can be launch with the following button :
BinaryLen, BinaryMid, BinaryToString, TCPAccept, TCPConnect, TCPSend, TCPStartup, TCPTimeout (Option)
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
; Start First clicking on "1. Server"
; Then start a second instance of the script selecting "2. Client"
Example()
Func Example()
TCPStartup() ; Start the TCP service.
; Register OnAutoItExit to be called when the script is closed.
OnAutoItExitRegister("OnAutoItExit")
; Assign Local variables the loopback IP Address and the Port.
Local $sIPAddress = "127.0.0.1" ; This IP Address only works for testing on your own computer.
Local $iPort = 65432 ; Port used for the connection.
#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)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
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)
WEnd
#EndRegion GUI
EndFunc ;==>Example
Func MyTCP_Client($sIPAddress, $iPort)
; Assign a Local variable the socket and connect to a listening socket with the IP Address and Port specified.
Local $iSocket = TCPConnect($sIPAddress, $iPort)
Local $iError = 0
; If an error occurred display the error code and return False.
If @error Then
; The server is probably offline/port is not opened on the server.
$iError = @error
MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Client:" & @CRLF & "Could not connect, Error code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
; Send the string "tata" to the server.
TCPSend($iSocket, "tata")
; If an error occurred display the error code and return False.
If @error Then
$iError = @error
MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Client:" & @CRLF & "Could not send the data, Error code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
; Close the socket.
TCPCloseSocket($iSocket)
EndFunc ;==>MyTCP_Client
Func MyTCP_Server($sIPAddress, $iPort)
Local $aPos = WinGetPos("TCP Server started")
WinMove("TCP Server started", "", $aPos[0], $aPos[1] - 100)
; Assign a Local variable the socket and bind to the IP Address and Port specified with a maximum of 100 pending connexions.
Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)
Local $iError = 0
If @error Then
; Someone is probably already listening on this IP Address and Port (script already running?).
$iError = @error
MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Server:" & @CRLF & "Could not listen, Error code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
; Assign a Local variable to be used by the Client socket.
Local $iSocket = 0
Do ; Wait for someone to connect (Unlimited).
; Accept incomming connexions if present (Socket to close when finished; one socket per client).
$iSocket = TCPAccept($iListenSocket)
; If an error occurred display the error code and return False.
If @error Then
$iError = @error
MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Server:" & @CRLF & "Could not accept the incoming connection, Error code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Return False
Until $iSocket <> -1 ;if different from -1 a client is connected.
; Close the Listening socket to allow afterward binds.
TCPCloseSocket($iListenSocket)
; Assign a Local variable the data received.
Local $sReceived = TCPRecv($iSocket, 4) ;we're waiting for the string "tata" OR "toto" (example script TCPRecv): 4 bytes length.
; Notes: If you don't know how much length will be the data,
; use e.g: 2048 for maxlen parameter and call the function until the it returns nothing/error.
; Display the string received.
MsgBox($MB_SYSTEMMODAL, "", "Server:" & @CRLF & "Received: " & $sReceived)
; Close the socket.
TCPCloseSocket($iSocket)
EndFunc ;==>MyTCP_Server
Func OnAutoItExit()
TCPShutdown() ; Close the TCP service.
EndFunc ;==>OnAutoItExit
; I am the client, start me after the server! (Start first the example 2 of the TCPSend function).
#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
Example()
Func Example()
Local $sMsgBoxTitle = "AutoItVersion = " & @AutoItVersion
TCPStartup() ; Start the TCP service.
; Register OnAutoItExit to be called when the script is closed.
OnAutoItExitRegister("OnAutoItExit")
; Assign Local variables the loopback IP Address and the Port.
Local $sIPAddress = "127.0.0.1" ; This IP Address only works for testing on your own computer.
Local $iPort = 65432 ; Port used for the connection.
; Assign a Local variable the socket and connect to a listening socket with the IP Address and Port specified.
Local $iSocket = TCPConnect($sIPAddress, $iPort)
; If an error occurred display the error code and return False.
If @error Then
; The server is probably offline/port is not opened on the server.
MsgBox(($MB_SYSTEMMODAL + $MB_ICONHAND), $sMsgBoxTitle, "Client: Could not connect" & @CRLF & " Error code: " & @error & @CRLF & @CRLF & _WinAPI_GetErrorMessage(@error))
Return False
EndIf
; Assign a Local variable the path of the file which will be received.
Local $sFilePath = @TempDir & "\temp.dat"
FileDelete($sFilePath)
; If an error occurred display the error code and return False.
If @error Then
MsgBox(($MB_SYSTEMMODAL + $MB_ICONEXCLAMATION), $sMsgBoxTitle, "Client: Invalid file chosen" & @CRLF & " Error code: " & @error & @CRLF & @CRLF & _WinAPI_GetErrorMessage(@error))
Return False
EndIf
; Assign a Local variable the handle of the file opened in binary overwrite mode.
Local $hFile = FileOpen($sFilePath, BitOR($FO_BINARY, $FO_OVERWRITE))
; Assign Locales Constant variables the number representing 4 KiB; the binary code for the end of the file and the length of the binary code.
Local $i4KiB = 4096
If $CmdLine[0] Then $i4KiB = $CmdLine[1]
Local $dData, $nReceivedBytes = 0, $n = 0, $fDiffTime, $hTimer = TimerInit()
#forceref $dData
While 1
$dData = TCPRecv($iSocket, $i4KiB, $TCP_DATA_BINARY)
; If an error occurred display the error code and return False.
If @error Then
MsgBox(($MB_SYSTEMMODAL + $MB_ICONHAND), $sMsgBoxTitle, "Client: Connection lost n=" & $n & @CRLF & " Error code: " & @error & @CRLF & @CRLF & _WinAPI_GetErrorMessage(@error))
Return False
ElseIf @extended = 1 Or BinaryLen($dData) = 0 Then
; If nothing is received
ExitLoop
EndIf
$nReceivedBytes += BinaryLen($dData)
$n += 1
;~ FileWrite($hFile, $dData) ; to be uncommented if file content to be written
WEnd
$fDiffTime = TimerDiff($hTimer)
; Close the file handle.
FileClose($hFile)
; Display the successful message.
;~ MsgBox($MB_SYSTEMMODAL, "", "Client:" & @CRLF & "File received nbBytes=" & & FileGetSize($sFilePath))
MsgBox($MB_SYSTEMMODAL, $sMsgBoxTitle, "Client: receivedBytes = " & $nReceivedBytes & " packetSize = " & $i4KiB & @CRLF & "File received TCPRecv = " & Int($fDiffTime / $n * 1000) & "µs Total = " & Int($fDiffTime) & "ms nPacket = " & $n)
; Close the socket.
TCPCloseSocket($iSocket)
EndFunc ;==>Example
Func OnAutoItExit()
TCPShutdown() ; Close the TCP service.
EndFunc ;==>OnAutoItExit