Bonjour,

Dans le cadre d'un projet universitaire, j'ai développé un server HTTP en C.

Mon problème vient lors des test de montée en charge, à partir d'un certain nombre de connexions simultanées, le serveur ne répond plus au client.

Cela semble du à la fonction listen (Socket), qui prend un paramètre backlog limitant le nombre de connections simultannées.
Comment faire pour gérer un nombre X de connections simultanées si le backlog est strictement infèrieur à X ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
if (listen(socket_file_descriptor, 10000) < 0){
        perror("Unnable to listen"); exit(EXIT_FAILURE);
}
while(1){
        client_socket_informations_lgth = sizeof(client_socket_informations);
        client_file_descriptor_socket = accept(socket_file_descriptor, (struct sockaddr *)&client_socket_informations, &client_socket_informations_lgth);
 
        if (client_file_descriptor_socket < 0){
            perror("Server accept failed."); exit(EXIT_FAILURE);
        }else if(client_file_descriptor_socket > 0){
            pid_t child;
            do {
                child = fork();
                fprintf(stderr, "Fork again");
            } while ((child == -1) && (errno == EAGAIN));
 
            if(child == 0){
                //Handling the client request
            } else if(child > 0){
                waitpid(child, NULL, 0);
                close(client_file_descriptor_socket);
            }
 
        }
    }
Sachant que sur mon client, ca plante lorsque je me connecte après avoir déjà créé le socket:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
if (connect(sockfd, (struct sockaddr *) &destAddr, sizeof(struct sockaddr)) == -1) {
        fprintf(stderr, "Error with client connecting to server\n");
        close(sockfd);
        return 0;
    }
La solution la plus viable serait d'après moi de toujours attendre que le nombre de connections simultanées soit infèrieur à X avant d'en accepter une nouvelle, cependant comment peut-on faire cela ?
Sinon prendre le problème à l'envers, et dire au client de re-tenter la connection tant qu'il a pas eu une réponse ? Cela signifiant que le serveur ne suit pas la montée en charge ! J'imagine que les client web classiques font cela, mais à quel point ?

Merci par avance