Erhält Daten von einem verbundenen "Socket".
TCPRecv ( mainsocket, maxlen [, flag = 0] )
mainsocket | Die verbundene "Socket"-Kennung (SocketID) wie von TCPAccept() oder TCPConnect() zurückgegben. |
maxlen | Maximale Anzahl der zu erhaltenen Zeichen. |
flag | [optional] Erzwingt die Rückgabe von Binärdaten von der Funktion wenn auf 1 gesetzt (Standard ist 0, und ermittelt automatisch binär oder String). $TCP_DATA_DEFAULT (0) - (Standard) es wird automatisch ermittelt zwischen Binärdaten und String (Standard) $TCP_DATA_BINARY (1) - liefert Binärdaten Die Konstanten sind in "AutoItConstants.au3" definiert. |
Erfolg: | Die Binärdaten/String gesendet vom verbundenen "Socket". Siehe Bemerkungen. |
Fehler: | "" und setzt das @error Flag auf ungleich null. |
@error: | -1 ungültiger Socket -2 nicht verbunden Windows API WSAGetLastError Rückgabewerte (siehe MSDN). |
@extended: | 1 kein Byte empfangen |
Aus Gründen der Abwärtskompatibilität versucht diese Funktion standardmäßig Strings zurückzugeben. Falls Nullzeichen (0x00) empfangen werden, ist der Rückgabewert binär.
Um die Rückgabe von Binärdaten von der Funktion zu erzwingen (die meist sinnvolle Option) ist der "flag" Parameter auf 1 zu setzen.
Falls Unicode-Strings übertragen werden sollen, so müssen diese mit StringToBinary() bzw. BinaryToString() verschlüsselt bzw. entschlüsselt werden.
Wenn keine weiteren Daten zu empfangen sind, lautet der Rückgabewert "" und @extended = 1.
Ein Test von TCPSend() und TCPRecv() kann mit dem folgenden Button gestartet werden:
BinaryLen, BinaryMid, BinaryToString, TCPAccept, TCPConnect, TCPSend, TCPStartup, TCPTimeout (Option)
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
; Zum starten zuerst auf "1. Server" klicken
; Dann durch "2. Client" eine zweite Instanz des Skripts starten
Example()
Func Example()
TCPStartup() ; Startet den TCP Service.
; Registriert OnAutoItExit um es aufzurufen, wenn das Script beendet wird.
OnAutoItExitRegister("OnAutoItExit")
; Weist lokalen Variablen die loopback IP-Adresse (localhost) und den Port zu.
Local $sIPAddress = "127.0.0.1" ; Diese IP-Adresse funktioniert nur am eigenen Computer.
Local $iPort = 65432 ; Port welcher für die Verbindung verwendet wird.
#Region GUI
Local $sTitle = "TCP Start"
Local $hGUI = GUICreate($sTitle, 250, 70)
Local $idBtnServer = GUICtrlCreateButton("1. Server", 10, 10, 130, 22)
Local $idBtnClient = GUICtrlCreateButton("2. Client", 10, 40, 130, 22)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idBtnServer
WinSetTitle($sTitle, "", "TCP Server gestartet")
GUICtrlSetState($idBtnClient, $GUI_HIDE)
GUICtrlSetState($idBtnServer, $GUI_DISABLE)
If Not MyTCP_Server($sIPAddress, $iPort) Then ExitLoop
Case $idBtnClient
WinSetTitle($sTitle, "", "TCP Client gestartet")
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)
; Weist einer lokalen Variable den Socket zu und verbindet sich zu einem lauschenden Socket mit der angegebenen IP-Adresse und Port.
Local $iSocket = TCPConnect($sIPAddress, $iPort)
Local $iError = 0
; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
If @error Then
; Der Server ist vermutlich offline oder der Port wurde nicht am Server geöffnet.
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Client:" & @CRLF & "Verbindung konnte nicht hergestellt werden, Error Code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
; Sendet den String "tata" konvertiert in die Binärrepräsentation zum Server.
TCPSend($iSocket, StringToBinary("tata"))
; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
If @error Then
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Client:" & @CRLF & "Daten konnten nicht gesendet werden, Error Code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
; Schließt den Socket.
TCPCloseSocket($iSocket)
EndFunc ;==>MyTCP_Client
Func MyTCP_Server($sIPAddress, $iPort)
Local $aPos = WinGetPos("TCP Server gestartet")
WinMove("TCP Server gestartet", "", $aPos[0], $aPos[1] - 100)
; Weist einer lokalen Variable den Socket zu und bindet die angegebene IP-Adresse sowie Port mit einer maximalen Anzahl von 100 anstehenden Verbindungen.
Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)
Local $iError = 0
If @error Then
; Vielleicht lauscht bereits jemand auf dieser IP-Adresse und dem Port (läuft das Script bereits?).
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Server:" & @CRLF & "Kann nicht lauschen, Error Code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
; Initialisiert eine lokale Variable um sie als Clientsocket zu nutzen.
Local $iSocket = 0
Do ; Wartet solange bis sich jemand verbindet (Unbegrenzt).
; Akzeptiert eingehende Verbindungen sofern präsent (Socket wird geschlossen wenn die Aufgabe abgeschlossen wurde; Ein Socket pro Client).
$iSocket = TCPAccept($iListenSocket)
; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
If @error Then
$iError = @error
MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), "", "Server:" & @CRLF & "Konnte die eingehende Verbindung nicht akzeptieren, Error Code: " & $iError & @CRLF & _WinAPI_GetErrorMessage($iError))
Return False
EndIf
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Return False
Until $iSocket <> -1 ; Sollte sich dieser Wert von -1 unterscheiden so hat sich ein Client erfolgreich verbunden.
; Schließt den gebundenen Socket damit er von anderen Anwendungen gebunden werden kann.
TCPCloseSocket($iListenSocket)
; Weist einer loaklen Variable die erhaltenen Daten zu.
Local $sReceived = TCPRecv($iSocket, 4) ; Wir warten auf den String "tata" oder "toto" (Beispielscript TCPRecv): 4 Bytes lang.
; Hinweis: Wenn man nicht weiß groß die ankommenden Daten sein werden, so kann man als Beispiel 2048 als maxlen-Parameter verwenden
; und die Funktion solange aufrufen, bis sie nichts bzw. einen Error zurückgibt.
; Zeigt den empfangenen String an.
MsgBox($MB_SYSTEMMODAL, "", "Server:" & @CRLF & "Empfangen: " & $sReceived)
; Schließt den Socket.
TCPCloseSocket($iSocket)
EndFunc ;==>MyTCP_Server
Func OnAutoItExit()
TCPShutdown() ; Schließt den 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