Partager via


fonction connect (winsock2.h)

La fonction connect établit une connexion à un socket spécifié.

Syntaxe

int WSAAPI connect(
  [in] SOCKET         s,
  [in] const sockaddr *name,
  [in] int            namelen
);

Paramètres

[in] s

Descripteur identifiant un socket non connecté.

[in] name

Pointeur vers la structure sockaddr à laquelle la connexion doit être établie.

[in] namelen

Longueur, en octets, de la structure sockaddr pointée vers le paramètre name .

Valeur retournée

Si aucune erreur ne se produit, la connexion retourne zéro. Sinon, il retourne SOCKET_ERROR, et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

Sur un socket bloquant, la valeur de retour indique la réussite ou l’échec de la tentative de connexion.

Avec un socket non bloquant, la tentative de connexion ne peut pas être effectuée immédiatement. Dans ce cas, connect retourne SOCKET_ERROR, et WSAGetLastError retourne WSAEWOULDBLOCK. Dans ce cas, il existe trois scénarios possibles :

  • Utilisez la fonction select pour déterminer l’achèvement de la demande de connexion en vérifiant si le socket est accessible en écriture.
  • Si l’application utilise WSAAsyncSelect pour indiquer son intérêt pour les événements de connexion, l’application reçoit une notification FD_CONNECT indiquant que l’opération de connexion est terminée (avec succès ou non).
  • Si l’application utilise WSAEventSelect pour indiquer l’intérêt pour les événements de connexion, l’objet d’événement associé est signalé indiquant que l’opération de connexion est terminée (avec succès ou non).

Tant que la tentative de connexion n’est pas terminée sur un socket non bloquant, tous les appels suivants pour se connecter sur le même socket échouent avec le code d’erreur WSAEALREADY et WSAEISCONN lorsque la connexion se termine correctement. En raison d’ambiguïtés dans la version 1.1 de la spécification des sockets Windows, les codes d’erreur retournés par la connexion alors qu’une connexion est déjà en attente peuvent varier d’une implémentation à l’autre. Par conséquent, il n’est pas recommandé que les applications utilisent plusieurs appels pour se connecter afin de détecter l’achèvement de la connexion. Si c’est le cas, ils doivent être prêts à gérer les valeurs d’erreur WSAEINVAL et WSAEWOULDBLOCK de la même façon qu’ils gèrent WSAEALREADY, pour garantir un fonctionnement robuste.

Si le code d’erreur retourné indique que la tentative de connexion a échoué ( c’est-à-dire, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT), l’application peut appeler à nouveau la connexion pour le même socket.

Code d'erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAEADDRINUSE
L’adresse locale du socket est déjà utilisée et le socket n’a pas été marqué pour permettre la réutilisation des adresses avec SO_REUSEADDR. Cette erreur se produit généralement lors de l’exécution de la liaison, mais peut être retardée jusqu’à la fonction de connexion si la liaison était à une adresse générique (INADDR_ANY ou in6addr_any) pour l’adresse IP locale. Une adresse spécifique doit être implicitement liée par la fonction de connexion .
WSAEINTR
L’appel bloquant Windows Socket 1.1 a été annulé via WSACancelBlockingCall.
WSAEINPROGRESS
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEALREADY
Un appel de connexion non bloquant est en cours sur le socket spécifié.
Note Afin de préserver la compatibilité descendante, cette erreur est signalée en tant que WSAEINVAL aux applications Windows Sockets 1.1 qui sont liées à Winsock.dll ou Wsock32.dll.
 
WSAEADDRNOTAVAIL
L’adresse distante n’est pas une adresse valide (par exemple , INADDR_ANY ou in6addr_any) .
WSAEAFNOSUPPORT
Impossible d'utiliser les adresses figurant dans la famille spécifiée avec ce socket.
WSAECONNREFUSED
La tentative de connexion a été rejetée.
WSAEFAULT
La structure sockaddr pointée vers le nom contient un format d’adresse incorrect pour la famille d’adresses associée ou le paramètre namelen est trop petit. Cette erreur est également retournée si la structure sockaddr pointée vers par le paramètre name avec une longueur spécifiée dans le paramètre namelen ne se trouve pas dans une partie valide de l’espace d’adressage utilisateur.
WSAEINVAL
Le paramètre s est un socket d’écoute.
WSAEISCONN
Le socket est déjà connecté (sockets orientés connexion uniquement).
WSAENETUNREACH
Le réseau ne peut pas être atteint à partir de cet hôte en ce moment.
WSAEHOSTUNREACH
Une opération de socket a été tentée sur un hôte impossible à atteindre.
WSAENOBUFS
Note Aucun espace tampon n’est disponible. Le socket ne peut pas être connecté.
 
WSAENOTSOCK
Le descripteur spécifié dans le paramètre s n’est pas un socket.
WSAETIMEDOUT
Une tentative de connexion a expiré sans établir de connexion.
WSAEWOULDBLOCK
Le socket est marqué comme non bloquant et la connexion ne peut pas être terminée immédiatement.
WSAEACCES
Une tentative de connexion d’un socket de datagramme à l’adresse de diffusion a échoué, car l’option setsockopt SO_BROADCAST n’est pas activée.

Remarques

La fonction connect est utilisée pour créer une connexion à la destination spécifiée. Si socket s, est non lié, les valeurs uniques sont attribuées à l’association locale par le système, et le socket est marqué comme lié.

Pour les sockets orientés connexion (par exemple, le type SOCK_STREAM), une connexion active est lancée à l’hôte étranger à l’aide du nom (une adresse dans l’espace de noms du socket ; pour une description détaillée, voir bind et sockaddr).

Note Si un socket est ouvert, un appel setsockopt est effectué, puis un appel sendto est effectué, Windows Sockets effectue un appel de fonction de liaison implicite.

 

Une fois l’appel de socket terminé, le socket est prêt à envoyer et à recevoir des données. Si le membre d’adresse de la structure spécifiée par le paramètre name est rempli de zéros, la connexion retourne l’erreur WSAEADDRNOTAVAIL. Toute tentative de reconnexion d’une connexion active échoue avec le code d’erreur WSAEISCONN.

Pour les sockets orientés connexion et non bloquants, il n’est souvent pas possible de terminer la connexion immédiatement. Dans ce cas, cette fonction retourne l’erreur WSAEWOULDBLOCK. Toutefois, l’opération continue.

Lorsque le résultat de la réussite ou de l’échec est connu, il peut être signalé de l’une des deux manières, selon la façon dont le client s’inscrit pour la notification.

  • Si le client utilise la fonction select , la réussite est signalée dans le jeu writefds et l’échec est signalé dans le jeu exceptfds.
  • Si le client utilise les fonctions WSAAsyncSelect ou WSAEventSelect, la notification est annoncée avec FD_CONNECT et le code d’erreur associé au FD_CONNECT indique la réussite ou une raison spécifique de l’échec.

Si la connexion n’est pas terminée immédiatement, le client doit attendre l’achèvement de la connexion avant d’essayer de définir les options de socket à l’aide de setsockopt. L’appel de setsockopt lorsqu’une connexion est en cours n’est pas pris en charge.

Pour un socket sans connexion (par exemple, le type SOCK_DGRAM), l’opération effectuée par connect consiste simplement à établir une adresse de destination par défaut qui peut être utilisée lors des appelsWSASend et recv/ ultérieurs / WSARecv. Tous les datagrammes reçus d’une adresse autre que l’adresse de destination spécifiée seront ignorés. Si le membre d’adresse de la structure spécifiée par nom est rempli de zéros, le socket est déconnecté. Ensuite, l’adresse distante par défaut étant indéterminée, l’envoi/ d’appelsWSASend et recv/ WSARecv retourne le code d’erreur WSAENOTCONN. Toutefois, sendto/ WSASendTo et recvfrom/ WSARecvFrom peuvent toujours être utilisés. La destination par défaut peut être modifiée en appelant simplement se connecter à nouveau, même si le socket est déjà connecté. Tous les datagrammes mis en file d’attente pour réception sont ignorés si le nom est différent de la connexion précédente.

Pour les sockets sans connexion, le nom peut indiquer n’importe quelle adresse valide, y compris une adresse de diffusion. Toutefois, pour se connecter à une adresse de diffusion, un socket doit utiliser setsockopt pour activer l’option SO_BROADCAST. Sinon, la connexion échoue avec le code d’erreur WSAEACCES.

Lorsqu’une connexion entre des sockets est interrompue, le socket connecté doit être ignoré et un nouveau socket doit être créé. Lorsqu’un problème se développe sur un socket connecté, l’application doit ignorer le socket et le recréer afin de revenir à un point stable.

Note Lors de l’émission d’un appel Winsock bloquant tel que la connexion, Winsock peut avoir besoin d’attendre qu’un événement réseau se termine. Winsock effectue une attente alertable dans cette situation, qui peut être interrompue par un appel de procédure asynchrone (APC) planifié sur le même thread. L’émission d’un autre appel Winsock bloquant à l’intérieur d’un APC qui a interrompu un appel Winsock bloquant en cours sur le même thread entraîne un comportement non défini et ne doit jamais être tenté par les clients Winsock.
 

Exemple de code

L’exemple suivant illustre l’utilisation de la fonction connect .
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int wmain()
{
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(27015);

    //----------------------
    // Connect to server.
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    wprintf(L"Connected to server.\n");

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}


Pour un autre exemple qui utilise la fonction connect, consultez Prise en main Avec Winsock.

Remarques pour les sockets IrDA

  • Le fichier d’en-tête Af_irda.h doit être inclus explicitement.
  • Si une connexion IrDA existante est détectée au niveau de l’accès au média, WSAENETDOWN est retourné.
  • S’il existe des connexions actives à un appareil avec une adresse différente, WSAEADDRINUSE est retourné.
  • Si le socket est déjà connecté ou si un changement de mode exclusif/multiplexé a échoué, WSAEISCONN est retourné.
  • Si le socket était précédemment lié à un nom de service local pour accepter les connexions entrantes à l’aide de bind, WSAEINVAL est retourné. Notez qu’une fois qu’un socket est lié, il ne peut pas être utilisé pour établir une connexion sortante.

IrDA implémente la fonction de connexion avec les adresses du formulaire sockaddr_irda. En règle générale, une application cliente crée un socket avec la fonction socket, analyse le voisinage immédiat des appareils IrDA avec l’option de socket IRLMP_ENUMDEVICES, choisit un appareil dans la liste retournée, forme une adresse, puis appelle connect. Il n’y a aucune différence entre la sémantique bloquante et non bloquante.

Configuration requise

   
Client minimal pris en charge Windows Vista [applications de bureau | applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winsock2.h
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

WSAAsyncSelect

WSAConnect

ConnectEx

Fonctions Winsock

Informations de référence sur Winsock

Accepter

bind

getsockname

select

sockaddr

socket