Création d’un socket pour le client

Après l’initialisation, un objet SOCKET doit être instancié pour être utilisé par le client.

Pour créer un socket

  1. Déclarez un objet addrinfo qui contient une structure sockaddr et initialisez ces valeurs. Pour cette application, la famille d’adresses Internet n’est pas spécifiée afin qu’une adresse IPv6 ou IPv4 puisse être retournée. L’application demande que le type de socket soit un socket de flux pour le protocole TCP.

    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
    
    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family   = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    
  2. Appelez la fonction getaddrinfo pour demander l’adresse IP du nom du serveur transmis sur la ligne de commande. Le port TCP sur le serveur auquel le client se connectera est défini par DEFAULT_PORT comme 27015 dans cet exemple. La fonction getaddrinfo retourne sa valeur sous la forme d’un entier qui est vérifié pour les erreurs.

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. Créez un objet SOCKET appelé ConnectSocket.

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. Appelez la fonction socket et retournez sa valeur à la variable ConnectSocket. Pour cette application, utilisez la première adresse IP retournée par l’appel à getaddrinfo qui correspond à la famille d’adresses, au type de socket et au protocole spécifiés dans le paramètre hints . Dans cet exemple, un socket de flux TCP a été spécifié avec un type de socket de SOCK_STREAM et un protocole de IPPROTO_TCP. La famille d’adresses n’a pas été spécifiée (AF_UNSPEC), de sorte que l’adresse IP retournée peut être une adresse IPv6 ou IPv4 pour le serveur.

    Si l’application cliente souhaite se connecter en utilisant uniquement IPv6 ou IPv4, la famille d’adresses doit être définie sur AF_INET6 pour IPv6 ou AF_INET pour IPv4 dans le paramètre hints .

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. Recherchez les erreurs pour vous assurer que le socket est un socket valide.

    if (ConnectSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

Les paramètres passés à la fonction socket peuvent être modifiés pour différentes implémentations.

La détection d’erreurs est un élément clé de la réussite du code réseau. Si l’appel du socket échoue, il retourne INVALID_SOCKET. L’instruction if du code précédent est utilisée pour intercepter les erreurs qui ont pu se produire lors de la création du socket. WSAGetLastError retourne un numéro d’erreur associé à la dernière erreur qui s’est produite.

Notes

Une vérification plus approfondie des erreurs peut être nécessaire en fonction de l’application.

Par exemple, la définition de hints.ai_family sur AF_UNSPEC peut entraîner l’échec de l’appel de connexion. Si cela se produit, utilisez une valeur IPv4 (AF_INET) ou IPv6 (AF_INET6) spécifique à la place.

WSACleanup est utilisé pour mettre fin à l’utilisation de la DLL WS2_32.

Étape suivante : Connexion à un socket

Prise en main avec Winsock

Initialisation de Winsock

Application cliente Winsock