Partager via


Création d’un socket pour le serveur

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

Pour créer un socket pour le serveur

  1. La fonction getaddrinfo est utilisée pour déterminer les valeurs dans la structure sockaddr :

    • AF_INET est utilisé pour spécifier la famille d’adresses IPv4.
    • SOCK_STREAM est utilisé pour spécifier un socket de flux.
    • IPPROTO_TCP est utilisé pour spécifier le protocole TCP .
    • AI_PASSIVE indicateur indique que l’appelant a l’intention d’utiliser la structure d’adresse de socket retournée dans un appel à la fonction de liaison . Lorsque l’indicateur AI_PASSIVE est défini et que le paramètre nodename de la fonction getaddrinfo est un pointeur NULL , la partie adresse IP de la structure d’adresse de socket est définie sur INADDR_ANY pour les adresses IPv4 ou IN6ADDR_ANY_INIT pour les adresses IPv6.
    • 27015 est le numéro de port associé au serveur auquel le client se connectera.

    La structure addrinfo est utilisée par la fonction getaddrinfo .

    #define DEFAULT_PORT "27015"
    
    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;
    hints.ai_flags = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  2. Créez un objet SOCKET appelé ListenSocket pour que le serveur écoute les connexions client.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. Appelez la fonction socket et retournez sa valeur à la variable ListenSocket. Pour cette application serveur, 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 pour IPv4 a été demandé avec une famille d’adresses IPv4, un type de socket de SOCK_STREAM et un protocole de IPPROTO_TCP. Une adresse IPv4 est donc demandée pour listenSocket.

    Si l’application serveur souhaite écouter sur IPv6, la famille d’adresses doit être définie sur AF_INET6 dans le paramètre hints . Si un serveur souhaite écouter à la fois sur IPv6 et IPv4, deux sockets d’écoute doivent être créés, l’un pour IPv6 et l’autre pour IPv4. Ces deux sockets doivent être gérés séparément par l’application.

    Windows Vista et versions ultérieures offrent la possibilité de créer un seul socket IPv6 placé en mode double pile pour écouter à la fois sur IPv6 et IPv4. Pour plus d’informations sur cette fonctionnalité, consultez Sockets à double pile.

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. Recherchez les erreurs pour vous assurer que le socket est un socket valide.

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

Étape suivante : Liaison d’un socket

Prise en main avec Winsock

Initialisation de Winsock

Application serveur Winsock