[Socket][Connect][Listen] Comment gérer une infinité de connections simultanées sur un socket - Backlog
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:
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:
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