Functions > Network >


TCPAccept

Permet les connexions entrantes sur un socket.

TCPAccept ( mainsocket )

Paramètre

mainsocket L'identifiant du socket principal (SocketID) tel que retourné par un appel à la fonction TCPListen.

Valeur de retour

Succès: Retourne l'identifiant du socket connecté.
Échec: Retourne -1 et définit @error <> 0.
@error: Valeur de retour de l'API windows WSAGetError (Consultez MSDN).

En relation

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

Exemples

Exemple 1

#include <MsgBoxConstants.au3>

; Je suis le serveur, démarrez-moi d'abord! (Démarrez ensuite l'exemple de script TCPConnect).

Example()

Func Example()
    TCPStartup() ; Démarre le service TCP.

    ; Enregistre OnAutoItExit qui sera appelé lorsque le script se fermera.
    OnAutoItExitRegister("OnAutoItExit")

    ; Affecte 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.

    ; Se connecte à l'adresse IP sur le port spécifié avec un maximum de 100 connexions en attente
    ; Consultez l'exemple de cette fonction pour plus de détails).
    Local $iListenSocket = TCPListen($sIPAddress, $iPort, 100)
    Local $iError = 0

    ; 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 (scénario déjà en cours?).
        $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Ecoute impossible, code d'erreur: " & $iError)
        Return False
    EndIf

    ; Affecte la variable locale pour l'écoute et le socket client.
    Local $iSocket = 0
    Do ; Attend que quelqu'un se connecte (illimité).
        ;Accepte les connexions entrantes si présent (Socket pour fermer 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), "", "Tentative de connexion refusé, code de l'erreur: " & $iError)
            Return False
        EndIf
    Until $iSocket <> -1 ; si $iSocket est différent de -1 un client est connecté.

    ; Ferme le socket d'écoute pour permettre d'autres connexions par la suite.
    TCPCloseSocket($iListenSocket)

    MsgBox($MB_SYSTEMMODAL, "", "Client connecté.")

    ; Ferme le socket.
    TCPCloseSocket($iSocket)
EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown() ; Ferme le service TCP.
EndFunc   ;==>OnAutoItExit


Exemple 2

#include <MsgBoxConstants.au3>

; Remarque: Consultez l'exemple 1 pour obtenir les commentaires utiles, cet exemple montre la fonction définie par l'utilisateur SocketToIP.

; Je suis le serveur, démarrez-moi d'abord! (Démarrez ensuite l'exemple de script TCPConnect).

Example()

Func Example()
    TCPStartup()

    OnAutoItExitRegister("OnAutoItExit")

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

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

    If @error Then
        $iError = @error
        MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Ecoute impossible, code d'erreur: " & $iError)
        Return False
    EndIf

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

        If @error Then
            $iError = @error
            MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Refus de la tentative de connexion, code d'erreur: " & $iError)
            Return False
        EndIf
    Until $iSocket <> -1

    TCPCloseSocket($iListenSocket)

    ; Récupére l'adresse IP associée au socket acceptée et l'assigne à une variable locale.
    Local $sClientIPAddress = SocketToIP($iSocket)

    ; Remarque: La fonction ci-dessus ne fonctionne pas avec le socket Listen, vous pouvez également l'utiliser avec le socket retournée par la fonction TCPConnect.

    ; Affiche un message de réussite avec l'adresse IP du client.
    MsgBox($MB_SYSTEMMODAL, "", "Client Connecté, adresse IP: " & $sClientIPAddress)

    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() ; Ferme le service TCP.
EndFunc   ;==>OnAutoItExit