Funktionreferenz


TCPRecv

Beschreibung anzeigen in

Erhält Daten von einem verbundenen "Socket".

TCPRecv ( mainsocket, maxlen [, flag = 0] )

Parameter

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.

Rückgabewert

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

Bemerkungen

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:

         
   
   
   
   

Verwandte Funktionen

BinaryLen, BinaryMid, BinaryToString, TCPAccept, TCPConnect, TCPSend, TCPStartup, TCPTimeout (Option)

Beispiel

Beispiel 1

#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


Beispiel 2

; 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