Funktionreferenz


TCPAccept

Beschreibung anzeigen in

Ermöglicht/Lässt einen eingehenden Verbindungsversuch auf einem "Socket" zu.

TCPAccept ( mainsocket )

Parameter

mainsocket Die Kennung des Haupt-Sockets (SocketID), wie von TCPListen zurückgegeben.

Rückgabewert

Erfolg: Die verbundene "Socket"-Kennung.
Fehler: -1 und setzt das @error Flag auf ungleich null
@error: -2 nicht verbunden.
Windows API WSAGetLastError Rückgabewerte (siehe MSDN).

Verwandte Funktionen

TCPCloseSocket, TCPListen, TCPRecv, TCPStartup, TCPTimeout (Option)

Beispiel

Beispiel 1

#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>

; Ich bin der Server, starte mich zuerst! (Startet danach das TCPConnect Beispielscript).

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.

    ; Bindet das Script an die IP-Adresse und zum Port mit einer maximalen Anzahl von 100 anstehenden Verbindungen.
    ; (Siehe das Beispiel für diese Funktion für weitere Details).
    Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)
    Local $iError = 0

    ; Wenn ein Fehler aufgetaucht ist, so wird dieser angezeigt und False zurückgegeben.
    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), "", "Es konnte nicht gelauscht werden, Error Code: " & $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), "", "Die eingehende Verbindung wurde nicht akzeptiert, Error Code: " & $iError)
            Return False
        EndIf
    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)

    MsgBox($MB_SYSTEMMODAL, "", "Client hat sich erfolgreich verbunden.")

    ; Schließt den Socket.
    TCPCloseSocket($iSocket)
EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown() ; Schließt den TCP Service.
EndFunc   ;==>OnAutoItExit

Beispiel 2

#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>

; Note: Check the Example 1 to get the useful comments, this example only demonstrates the SocketToIP user-defined function.

; I am the server, start me first! (Start in second the TCPConnect example script).

Example()

Func Example()
    Local $sMsgBoxTitle = "AutoItVersion = " & @AutoItVersion

    TCPStartup()

    OnAutoItExitRegister("OnAutoItExit")

    Local $sIPAddress = "127.0.0.1"
    Local $iPort = 65432

    Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)

    If @error Then
        MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), $sMsgBoxTitle, "Could not listen, Error code: " & @error & @CRLF & @CRLF & _WinAPI_GetErrorMessage(@error))
        Return False
    EndIf

    Local $iSocket = 0
    Do
        $iSocket = TCPAccept($iListenSocket)

        If @error Then
            MsgBox(($MB_ICONERROR + $MB_SYSTEMMODAL), $sMsgBoxTitle, "Could not accept the incoming connection, Error code: " & @error & @CRLF & @CRLF & _WinAPI_GetErrorMessage(@error))
            Return False
        EndIf
    Until $iSocket <> -1

    TCPCloseSocket($iListenSocket)

    ; Retrieve the IP Address associated with the accepted socket and assign it to a Local variable.
    Local $sClientIPAddress = SocketToIP($iSocket)

    ; Note: The above function does NOT work with the Listen socket, you can also use it with the socket returned by the TCPConnect function.

    ; Display the sucessful message with the client IP Address.
    MsgBox($MB_SYSTEMMODAL, $sMsgBoxTitle, "Client Connected, IP Address: " & $sClientIPAddress, 3)

    TCPCloseSocket($iSocket)
EndFunc   ;==>Example

Func SocketToIP($iSocket)
    Local $tSockAddr = 0, $aRet = 0
    $tSockAddr = DllStructCreate("short;ushort;uint;char[8]")
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $iSocket, "struct*", $tSockAddr, "int*", DllStructGetSize($tSockAddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tSockAddr, 3))
        If Not @error Then Return $aRet[0]
    EndIf
    Return 0
EndFunc   ;==>SocketToIP

Func OnAutoItExit()
    TCPShutdown() ; Close the TCP service.
EndFunc   ;==>OnAutoItExit