Pourquoi avons-nous besoin de créer différents processus pour chaque client sur un serveur simultané en C?

Je travaillais sur un programme simple de serveur client, avec l’intention de créer un programme de discussion. Je suis nouveau dans la programmation de socket en C. J’ai appris que pour servir plusieurs clients, le serveur doit générer un nouveau processus chaque fois qu’un client se connecte. Chaque fois qu’un client demande une connexion, la fonction accept() renvoie un identificateur de descripteur et après le fork() le parent ferme l’identifiant.

Au lieu de cela, je n’ai pas fermé l’ID, de sorte que chaque nouveau client obtienne un newid, lorsque accept () est invoqué.

 nsockfd = accept(lsockfd, (struct sockaddr *) &cli_addr, &cli_len); 

maintenant ceci est stocké dans 2 variables:

  if (client1 < 0) { client1 = nsockfd; printf("if loop %d\n",nsockfd); } else { client2 = nsockfd; printf("else loop %d\n",nsockfd); } 

Maintenant, rest du code est

  snprintf(buf, sizeof(buf), "Hi client1 Nice to meet you.",inet_ntoa(cli_addr.sin_addr)); ret = send(client1, buf, strlen(buf), 0); if (ret == -1) { perror("Error sending message"); exit(1); } printf("SRV - %s\n", buf); strcpy(buf,""); snprintf(buf, sizeof(buf), "Hi client2 Nice to meet you.",inet_ntoa(cli_addr.sin_addr)); if(client2 > 0) {ret = send(client2, buf, strlen(buf), 0); if (ret == -1) { perror("Error sending message"); exit(1); } printf("SRV - %s\n", buf); strcpy(buf,""); 

Ici, le code fonctionne comme prévu; chaque client imprime une seule des déclarations.

S’il s’agit d’une méthode sans faille, pourquoi apprend-on que fork() doit être utilisé pour servir chaque client.

Je travaille sur un localhost? Est-ce la raison pour laquelle ce code fonctionne pour moi?

Ce n’est pas un serveur simultané si vous ne faites pas fork() ou traitez la connexion dans un (nouveau?) Thread. C’est la définition d’un serveur concurrent.

Si je lis correctement votre code, vous obtenez un serveur séquentiel simple. Il ne peut traiter qu’une seule connexion à la fois. C’est bien si le calcul requirejs pour chaque réponse est minimal, comme dans votre exemple. Ce n’est pas si bon si le calcul implique beaucoup d’efforts – par exemple, l’access au disque ou à la firebase database.

Notez qu’une conception de serveur séquentiel est tout à fait légitime. Il en va de même pour la conception de serveurs concurrents. Ils doivent être appliqués à différentes charges de travail. En règle générale, cependant, un serveur simultané gère de meilleurs volumes de trafic qu’un serveur séquentiel. Imaginez si Google utilisait des serveurs séquentiels pour répondre aux demandes de recherche!

Une autre conception utilise un pool de threads ou un pool de processus avec un thread ou un processus qui répartit le travail sur d’autres threads ou processus. Celles-ci sont plus difficiles à écrire et fonctionnent bien.